Форум » Clipper » error M6101 » Ответить

error M6101

Dima: ? (-31.1*0)/(-31.1*0) // m6101 , почему падает ? ? (-31*0)/(-31*0) // 0 ? 0/0 //0

Ответов - 7

Pasha: Если сделать ? ftoc(0) ? ftoc(0.0) ? ftoc(31.0*0) ? ftoc(-31.0*0) то видно, что ftoc(-31.0*0) делает что-то не так

Pasha: Вот описание стандарта 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 позволяет на него делить

Pasha: Функцию я написал, но ее надо скомпилировать через 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 ); }


Dima: Pasha Спасибо !!!

suv2: Dima пишет: ? (-31.1*0)/(-31.1*0) // m6101 , почему падает ? прикольно 5.2е не падает, в результате деления получается бесконечность с каким-то знаком но падает на (-31.1*0)/(-31.1*0) > 0 ошибку деления на ноль они умеют обрабатывать, а на минус ноль - нет )

azoo: Обнаружил вот что: a=1 b=0 c=a/b ? c Переменная c получается =0 и в Clipper и в Harbour. Почему не выходит ошибка деления на ноль ?

Pasha: Обычно эта ошибка переопределяется в обработчике ошибок, примерно так: if ( e:genCode == EG_ZERODIV ) return (0) end



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