A * B / C != A / C * B >:(

Тема в разделе "WASM.ZEN", создана пользователем S_T_A_S_, 26 дек 2004.

  1. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    О причинах и методах обхода сабжа я знаю, да видно плохо :-(

    Есть некоторая прога, когда в одной из строк убираю "лишние" множители (16384), поведение меняется:


    Код (Text):
    1.  
    2. unsigned foo(unsigned arg);
    3.  
    4. unsigned bar;
    5.  
    6. //
    7.  
    8. foo ( bar * (32 + (unsigned)((__int64)(8 * 44100 << 6 ) * 16384 / 1773400)) / 16384 );
    9.  




    Может кто подскажет, как тут скобочки правильно расставлять ?

    (пока в HELHEIM не переместили :)
     
  2. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Что-то меня плющит.... тут же сложение !!! :)))))

    Вот теперь можно в HELHEIM
     
  3. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    S_T_A_S_





    При такой расстановке скобок (32 + (unsigned)((__int64)(8 * 44100 << 6 ) * 16384 / 1773400)) является константой.



    А откуда такое странное число 1773400?
     
  4. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Про константу понятно :) я просто пытался это выражение упростить (изначально там было штук 20 макроконстант)

    На экран не помещалось, да и глаз замылился, минут 20 просидел, не мог понять, почему константа меняется, если убрать числа 16384 8-)



    >




    Это тактовая частота музыкального сопроцессора AY-3-8912 (YM-8910) на Спектруме.
     
  5. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    S_T_A_S_

    Мне кажется, что (__int64) не работает.

    Может так ....... (__int64)8 * 44100 .....

    И потом - не проще у Виндусового калькулятора

    спросить. Кстати, если транслятор для

    проца какого-то, то он может вообще в 32-битах

    работать. У меня например вообще 16-бит,

    хотя константы длинные понимает.
     
  6. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    valterg



    Тут дело не в (__int64) :)

    Вот здесь 5 правых скобк, но левых 4 !!!!!!

    (unsigned)((__int64)(8 * 44100 << 6 ) * 16384 / 1773400)) / 16384

    т.е на 16384 делится не произвеедение, а сумма 32 + ...

    Это один из самых тупых глюков, которые со мной происходили =))))))

    А всё потому что шрифт в редакторе слишком крупный =)))