Форум » » IPPOLIT & ROBBOLITO » Ответить

IPPOLIT & ROBBOLITO

Bison: Предлагаю обсудить особенности устройства Ипполита. Все-таки некаждый день появляются сильнейшие opensource программы.

Ответов - 251, стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 All

дуп: 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



полная версия страницы