Форум » » IPPOLIT & ROBBOLITO » Ответить
IPPOLIT & ROBBOLITO
Bison: Предлагаю обсудить особенности устройства Ипполита. Все-таки некаждый день появляются сильнейшие opensource программы.
дуп: NS пишет: результат умножения будет иметь какой тип? int32 или uint64? uint64 В это x эти сутки влезут более 6 миллиардов раз
bankuss: во фрукте сделано деление /1000 и числа типа double можно попробовать так же
NS: А может всё-таки результат умножения будет int32? Не знаю соглашений в этом языке, а в делфи резльтат будет 100% int32, а потом уже будет преобразовываться в int64.
NS: А не проще ли умножить просто на константу типа uint64 равную 1000? Вместо умножения на 1000.
bankuss: double now_real() { return double(GetTickCount()) / 1000.0; }
NS: Банкусс, ты о чем? uint64 tt = 1000; x = GetTickCount() * tt; исправляет эту ошибку. больше ничего переписывать не надо.
дуп: Видел в файле cerca.c подозрительное место: TRASMISSIONE ("info time %lld nodes %lld nps %lld %s %s depth %d seldepth %d pv %s\n", t, NODOS, nps * 1000, modificatore (BASSO, valu, ALTO, STRING3), cp_mate (valu, STRING2), radice_abisso / 2, sd, pv); } В коде считаются беззнаковые типы uint64, а здесь спецификаторы формата для nodes и nps для знаковых. Маловероятно, конечно, но лучше, думаю переправить так: ("info time %I64d nodes %I64d nps %I64d %s %s depth %d seldepth %d pv %s\n",
WildCat: NS А может всё-таки результат умножения будет int32? Не знаю соглашений в этом языке, а в делфи резльтат будет 100% int32, а потом уже будет преобразовываться в int64. Результат умножения будет 32-битный, и будет переполнятся 20 раз в сутки. Достаточно один из операндов преобразовать в 64 бита. GetTickCount() * uint64(1000)
NS: А вообще еще бы хорошо заменить GetTickCount на timeGetTime.
NS: WildCat пишет: Результат умножения будет 32-битный, и будет переполнятся 20 раз в сутки. Да знаю я. :)
bankuss: NS я про то, что написал WildCat WildCat пишет: GetTickCount() * uint64(1000) 1000 компилятор возьмет как 32-битную константу. NS пишет: uint64 tt = 1000; а так уже возьмет правильно :)
bankuss: дуп да, надо поправить. хотя у меня и с lld вроде без ошибок выводит
WildCat: bankuss, uint64(1000) - это 64-битная константа. NS Да знаю я. :) Не знаю соглашений в этом языке Так знаешь или нет?
NS: Знаю. Это я издеваюсь так. Я же выше написал что глюк в этом месте. Точнее - не проверял, но был практически уверен что приведение типов работает также как в делфи. bankuss пишет: дуп да, надо поправить. хотя у меня и с lld вроде без ошибок выводит Нет смысла править - в этом месте всё ОК.
дуп: Я не знаю, чего там у вас с WildCat- ом за левые компиляторы: //////////////////////////////////////// #define uint64 unsigned __int64 int main() { uint64 number = 86400000; uint64 big_number = number * 600; printf("res = %I64d\n", big_number); return 0; } //////////////////////////////////////////// На экране : res = 51840000000
WildCat: дуп, попробуй так: #define uint64 unsigned __int64 #define uint32 unsigned __int32 int main() { uint32 number = 86400000; uint64 big_number = number * 600; printf("res = %I64d\n", big_number); return 0; } Именно так в Ипполите.
дуп: Да, так не влезает. Никогда про такое не слышал и не читал. Так и не понял почему. Даже если он при таких дефайнах неявно приводит множитель к 4-байтному типу, при чем тут результат?
NS: Результат перемножения четырехбайтных - четырехбайтное число. потеряли точность уже в процессе умножения. Понять вроде очень просто. Чтоб в результате умножения получить 64битное - нужно один из множителей привести к 64битному виду. Ты в своем примере умножаешь 64битное, поэтому у тебя всё ОК. А GetTickCount -32 битное.
WildCat: Результат умножения двух 32-битных чисел сперва записывается в 32-битный регистр, а уж затем значение из этого регистра записывается в 64-битную переменную. Естественно старшие разряды теряются.
дуп: NS пишет: А вторая причина зависаний - это останавливаются часы. Надо смотреть где с разрядностью переменных накосячено. uint64 x; x = GetTickCount() * 1000; В этом коде переполнение наверно действительно получается. Вот где недоразумение. Вы то говорите глядя как в коде, а я только на пост NS. А у него здесть x uint64
полная версия страницы