Может кто нибуть подсказать как перевести сей код на С. Без использования ассемблера. Необходимо получить туже последовательность псевдослучайных чисел. Код (Text): function Rand_0_1 : extended; const revMaxLong: double = ((1.0/$10000) / $10000); // 2^-32 asm IMUL EDX,randShift,08088405H INC EDX MOV randShift,EDX FLD revMaxLong PUSH 0 PUSH EDX FILD qword ptr [ESP] ADD ESP,8 FMULP ST(1), ST(0) end; Буду крайне признателен.
вроде бы что-то типа такого: Код (Text): int randShift; long double Rand_0_1() { const double revMaxLong = 1.0 / 0x10000 / 0x10000; randShift = randShift * 0x08088405 + 1; return revMaxLong * randShift; }
Можно поточнее, получается последовательность с небольшими отклонениями, я подозреваю что дело в округлении, только не могу понять где именно проблема.
попробуй Код (Text): const long double revMaxLong = 1.0 / 0x10000 / 0x10000; Но тут же возникает вопрос по технической части - допустим имеем исходное: Код (Text): const double revMaxLong = 1.0 / 0x10000 / 0x10000; параметры трактуются как 1.0f т.е. как флоат, т.е. число хранится как 4 байта, так? если же явно прописать 1.0d то как 8байт, так? а что для 10 байт написать тогда надо (1.0*)?) и преобразование в каждом из случаев осуществляется: 4->10, 8->10, 10->10 внутренне. (при установленной макс. точности в CW). [+] В общем, на какой стадии возникает "обрезка"?