Автор | Сообщение |
|
| |
Пост N: 841
Зарегистрирован: 17.05.05
|
|
Отправлено: 07.07.08 10:40. Заголовок: error M6101
? (-31.1*0)/(-31.1*0) // m6101 , почему падает ? ? (-31*0)/(-31*0) // 0 ? 0/0 //0
|
|
|
Ответов - 7
[только новые]
|
|
|
| Администратор
|
Пост N: 938
Зарегистрирован: 23.05.05
|
|
Отправлено: 07.07.08 11:54. Заголовок: Если сделать ? ftoc..
Если сделать ? ftoc(0) ? ftoc(0.0) ? ftoc(31.0*0) ? ftoc(-31.0*0) то видно, что ftoc(-31.0*0) делает что-то не так
|
|
|
|
| Администратор
|
Пост N: 939
Зарегистрирован: 23.05.05
|
|
Отправлено: 07.07.08 14:07. Заголовок: Вот описание стандар..
Вот описание стандарта double ieee 754: http://polimage.polito.it/CodeSimulink/help/CodeSimulink/IEEE%20Standard%20754%20Floating-Point.htm Видно, что в результате вычисления -31.0*0 получается 1 в знаковом бите, и при делении на такой "ноль с палочкой" С-библиотека генерирует runtime-error Я вижу только один выход: написать на С процедуру, которая проверяла бы числовой параметр, и в случае ноля с палочкой возвращала бы нормальный рабоче-крестьянский ноль В Харборе тоже, кстати, -31.0*0 получается ноль с палочкой, но, в отличие от клиппера, bcc55 позволяет на него делить
|
|
|
|
| Администратор
|
Пост N: 940
Зарегистрирован: 23.05.05
|
|
Отправлено: 07.07.08 14:55. Заголовок: Функцию я написал, н..
Функцию я написал, но ее надо скомпилировать через MSC, которого у меня сейчас нет. BC не подходит #include <dos.h> #include "extend.h" CLIPPER TrueZero( ) { double d; char *s; if( _parinfo(1) & DOUBLE ) { d = _parnd(1); s = (char*) &d; if(s[0]==0 && s[1]==0 && s[2]==0 && s[3]==0 && s[4]==0 && s[5]==0 && s[6]==0 && s[7]==128) _retnd(0); else _retnd(d); } else if( ISNUM(1) ) _retni( _parni(1) ); else _retni( 0 ); }
|
|
|
|
| |
Пост N: 842
Зарегистрирован: 17.05.05
|
|
Отправлено: 07.07.08 19:13. Заголовок: Pasha Спасибо !!!..
Pasha Спасибо !!!
|
|
|
|
| постоянный участник
|
Пост N: 121
Зарегистрирован: 24.09.05
|
|
Отправлено: 11.07.08 09:20. Заголовок: Dima пишет: ? (-31...
Dima пишет: цитата: | ? (-31.1*0)/(-31.1*0) // m6101 , почему падает ? |
| прикольно 5.2е не падает, в результате деления получается бесконечность с каким-то знаком но падает на (-31.1*0)/(-31.1*0) > 0 ошибку деления на ноль они умеют обрабатывать, а на минус ноль - нет )
|
|
|
|
| |
Пост N: 103
Зарегистрирован: 24.04.13
|
|
Отправлено: 15.09.15 15:56. Заголовок: Обнаружил вот что: a..
Обнаружил вот что: a=1 b=0 c=a/b ? c Переменная c получается =0 и в Clipper и в Harbour. Почему не выходит ошибка деления на ноль ?
|
|
|
|
| Администратор
|
Пост N: 3340
Зарегистрирован: 23.05.05
|
|
Отправлено: 15.09.15 16:29. Заголовок: Обычно эта ошибка пе..
Обычно эта ошибка переопределяется в обработчике ошибок, примерно так: if ( e:genCode == EG_ZERODIV ) return (0) end
|
|
|
|