Помогите разобраться в коде

Тема в разделе "WASM.BEGINNERS", создана пользователем gimalay, 6 июн 2007.

  1. gimalay

    gimalay New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    3
    Может кто нибуть подсказать как перевести сей код на С. Без использования ассемблера.
    Необходимо получить туже последовательность псевдослучайных чисел.

    Код (Text):
    1. function Rand_0_1 : extended;
    2. const revMaxLong: double = ((1.0/$10000) / $10000);  // 2^-32
    3.  
    4. asm
    5.         IMUL    EDX,randShift,08088405H
    6.         INC     EDX
    7.         MOV     randShift,EDX
    8.         FLD     revMaxLong
    9.         PUSH    0
    10.         PUSH    EDX
    11.         FILD    qword ptr [ESP]
    12.         ADD     ESP,8
    13.         FMULP  ST(1), ST(0)
    14. end;
    Буду крайне признателен.
     
  2. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    вроде бы что-то типа такого:
    Код (Text):
    1. int randShift;
    2.  
    3. long double Rand_0_1()
    4. {
    5.     const double revMaxLong = 1.0 / 0x10000 / 0x10000;
    6.     randShift = randShift * 0x08088405 + 1;
    7.     return revMaxLong * randShift;
    8. }
     
  3. gimalay

    gimalay New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    3
    Можно поточнее, получается последовательность с небольшими отклонениями, я подозреваю что дело в округлении, только не могу понять где именно проблема.
     
  4. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    попробуй
    Код (Text):
    1.     const long double revMaxLong = 1.0 / 0x10000 / 0x10000;
    Но тут же возникает вопрос по технической части - допустим имеем исходное:
    Код (Text):
    1.     const double revMaxLong = 1.0 / 0x10000 / 0x10000;
    параметры трактуются как 1.0f т.е. как флоат, т.е. число хранится как 4 байта, так?
    если же явно прописать 1.0d то как 8байт, так? а что для 10 байт написать тогда надо (1.0*)?)
    и преобразование в каждом из случаев осуществляется: 4->10, 8->10, 10->10 внутренне. (при установленной макс. точности в CW).
    [+]
    В общем, на какой стадии возникает "обрезка"?
     
  5. gimalay

    gimalay New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    3
    Большое спасибо за помощь, ошибка была в том что использовалось целое со знаком.