GN>>Замечания к С коду (не принимая во внимания исходный asm) GN>>
GN>>double Rand_0_1()
GN>>{ __int64 f=randShift*__int64(0x8088405);
GN>> f+=0x00010000LL;
GN>> f&=0xffff0000LL; // результат будет всегда помещаться в 32 бита, смысла использовать 64х битный тип нет
GN>> randShift=f>>32; // здесь всегда 0
GN>> return float(randShift)*revMaxLong;
GN>>} GN>>Исходя только из этого видно, что код некорректен.
C> Результат тут не причём, тут затрагиваются просто первые 32 бита из 64, а потом они почему-то сдвигаются вправо...
В общем бессмычленно обсуждать ошибки. Возможно Вы говорите тоже что и gear nuke. Первое — я увидел EDX и решил почемуто что старшие нужны, взятие по мске написал просто для наглядности, оно то и не нужно, Второе — както непривычно писать 0xffffffff00000000LL.
У gear nuke тут действительно ошибка.
unsignedint randShift;
long double Rand_0_1()
{
randShift = randShift * 134775813 + 1; // тип муля по барабану - хош MUL хош IMUL на младшие не влияетreturn randShift*((1.0/0x10000) / 0x10000); // здесь randShift безззнаковое
}
В сопроцессор загружаются 64 бита. Дело в том что FILD принимает знаковое, а
PUSH 0
PUSH EDX
расширяет EDX нулями и загругка длинная-длинная FILD qword ptr [ESP].
Может кто нибуть подсказать как перевести сей код на С. Без использования ассемблера.
Необходимо получить туже последовательность псевдослучайных чисел.
Здравствуйте, gimalay, Вы писали:
G>Может кто нибуть подсказать как перевести сей код на С. Без использования ассемблера. G>Необходимо получить туже последовательность псевдослучайных чисел.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Здравствуйте, Programador,
P>чет давненько 86-м не баловался
Замечания к С коду (не принимая во внимания исходный asm)
double Rand_0_1()
{ __int64 f=randShift*__int64(0x8088405);
f+=0x00010000LL;
f&=0xffff0000LL; // результат будет всегда помещаться в 32 бита, смысла использовать 64х битный тип нет
randShift=f>>32; // здесь всегда 0return float(randShift)*revMaxLong;
}
Исходя только из этого видно, что код некорректен.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
GN>Замечания к С коду (не принимая во внимания исходный asm) GN>
GN>double Rand_0_1()
GN>{ __int64 f=randShift*__int64(0x8088405);
GN> f+=0x00010000LL;
GN> f&=0xffff0000LL; // результат будет всегда помещаться в 32 бита, смысла использовать 64х битный тип нет
GN> randShift=f>>32; // здесь всегда 0
GN> return float(randShift)*revMaxLong;
GN>} GN>Исходя только из этого видно, что код некорректен.
Результат тут не причём, тут затрагиваются просто первые 32 бита из 64, а потом они почему-то сдвигаются вправо...
Здравствуйте, Cruser, Вы писали:
C> Результат тут не причём, тут затрагиваются просто первые 32 бита из 64
Ну, если начнём касаться исходного ассемблера — то команда
IMUL EDX,randShift,08088405H
это 32х битное умножение. Так что минус лучше себе поставь
C>а потом они почему-то сдвигаются вправо...
И в результате функции всегда 0
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth