| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > почему 5+5=-2 ? |
| Автор: Larrikin 28.9.2007, 12:06 | ||||
есть такой код
выдает: id(1) value(5.000000) best: id1(-1) id2(-1) act(+) result(-2.000000) err(0.000000) каким образом пять плюс пять получается минус два и как с этим бороться? не могу придумать в какую сторону гуглить... -2 может получиться, если складывать не n[1].value, а n[1].id - только с какой радости это может происходить? описание сделано в файле ncalc.h
|
| Автор: comcon1 28.9.2007, 12:18 | ||||
Бред какой-то. Вот эта строчка меня смущает...
разве можно называть структуру ключевым словом??? или я чот не в теме переназови тип и выведи так:
|
| Автор: Larrikin 28.9.2007, 12:33 | ||||
насчет ключеватости имени был не в курсе в-виду нубства в С, переделал в такое ncalc.h:
код стал:
вывод: id(1) value(5.000000) idsum0 (-2.000000) idsum1 (-2.000000) best: id1(-1) id2(-1) act(+) result(-2.000000) err(0.000000) |
| Автор: Ln78 28.9.2007, 12:45 |
| А компилятор какой? Возможно, для long double нужно использовать формат Lf. Ну и просто, если есть возможность в отладчике посмотреть сами значения (не printf), то можно это сделать для локализации ошибки. |
| Автор: Larrikin 28.9.2007, 12:56 | ||
| > uname -rs FreeBSD 6.2-STABLE > ll total 26 -rw-r--r-- 1 larrikin wheel 1330 Sep 28 12:46 best_plus.c -rw-r--r-- 1 larrikin wheel 1684 Sep 28 14:05 best_plus.o drwxr-xr-x 2 larrikin wheel 512 Sep 27 21:56 data -rw-r--r-- 1 larrikin wheel 1934 Sep 27 20:55 getdata.c -rw-r--r-- 1 larrikin wheel 1812 Sep 28 14:05 getdata.o -rwxr-xr-x 1 larrikin wheel 356 Sep 27 21:21 lmake -rw-r--r-- 1 larrikin wheel 950 Sep 28 09:49 main.c -rw-r--r-- 1 larrikin wheel 1368 Sep 28 14:05 main.o -rwxr-xr-x 1 larrikin wheel 7758 Sep 28 14:05 ncalc -rw-r--r-- 1 larrikin wheel 562 Sep 28 12:37 ncalc.h > ./lmake gcc -c best_plus.c getdata.c main.c -I /home/larrikin/files/ncalc gcc -c best_plus.c getdata.c main.c -I /home/larrikin/files/ncalc gcc -c best_plus.c getdata.c main.c -I /home/larrikin/files/ncalc gcc -o ncalc best_plus.o getdata.o main.o > Добавлено через 14 минут и 4 секунды вот нашел вроде непонятную интересность:
выдает id(1) value(5.000000) id(1) value(5.000000) crazy 5.000000 + 0.000000 = 0.000000 idsum0 (nan) idsum1 (-2.000000) best: id1(-1) id2(-1) act(+) result(-2.000000) err(0.000000) че за? |
| Автор: akizelokro 28.9.2007, 13:21 |
| Поменяй формат вывода, вместо "%lf" поставь "%3.4e" |
| Автор: Larrikin 28.9.2007, 13:25 | ||
какая-то бугага полная
id(1) value(5.0000e+00) id(1) value(5.0000e+00) crazy 5.0000e+00 + 3.3172e-315 = 6.6564e-116 idsum0 (-2.0000e+00) idsum1 (-2.0000e+00) best: id1(-1) id2(-1) act(+) result(-2.0000e+00) err(3.2379e-319) Добавлено через 4 минуты и 26 секунд может быть это из-за того, что машина выполняется под VMWare? |
| Автор: akizelokro 28.9.2007, 13:30 |
| Проверь тогда где у тебя 1(единица), а где l(буква лы). Неа, все онрма. Уже посмотрел сам. попробуй еще... рискну предложить на время Long double поменять на double |
| Автор: Larrikin 28.9.2007, 13:35 |
| проверил все вхождения 1 и l - всё на местах... |
| Автор: xvr 28.9.2007, 14:06 | ||||||||
В gcc long double выводится по формату Lf, а не lf: man 3 printf:
|
| Автор: Larrikin 28.9.2007, 14:49 |
да, похоже делов в этом, прочесал все файлы и стало выводить корректно ожидаемо... |