- Код: Выделить всё
program Project1;
uses Math;
var
R: Double =0;
begin
if R=NaN then;
ReadLn;
end.
Это так и должно быть или это баг?
Lazarus 3.8 (rev lazarus_3_8) FPC 3.2.2 x86_64-win64-win32/win64
Модератор: Модераторы
program Project1;
uses Math;
var
R: Double =0;
begin
if R=NaN then;
ReadLn;
end.
Reading symbols from ./Project1...
(gdb) r
Starting program: /tmp/Project1
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Program received signal SIGFPE, Arithmetic exception.
0x00005555555800ab in $main () at Project1.pas:8
8 if R=NaN then;
(gdb) bt
#0 0x00005555555800ab in $main () at Project1.pas:8
program Project1;
uses Math;
begin
if (0/0)=NaN then WriteLn('*');
end.
Спасибо, то что надо.Alexander писал(а):функция https://lazarus-ccr.sourceforge.io/docs ... isnan.html есть.
Просто мой вычислительный код спокойно работал в LCL приложении, а когда я его в консоли стал использовать, все эти проверки посыпались. Не хорошо это.Alexander писал(а):Это не простой вопрос, ведь формально тогда сравниваются нечисло и число.
Osmiy писал(а):Это так и должно быть или это баг?
if d.IsNaN then
...
SetExceptionMask(GetExceptionMask + [exInvalidOp]);
if d = NaN then
...
program Project1;
uses Math;
var
R: Double =0;
begin
if IsNan( R ) then WriteLn('*');
ReadLn;
end.
Alex2013 писал(а):Мдя "тихие нечисла" вещь в себе . (Честно говоря никогда не думал, что есть возможность добраться до них из кода на паскале )
Зы
В чем смысл сравнения ? Это же состояние FPU по идее его вообще нельзя записать в переменную.
То есть после какой-то операции оно может вылезти "как фаг" но пустая примерная которая просто лежит в памяти ни как содержать нечисло не может . Именно в этом смысл этого кода if (0/0)=NaN then WriteLn('*'); что-то сделано и это можно проверить но записать нечисло в переменную по идее нельзя (впрочем я опыта использования NaN не имею так что могу ошибаться )
Зы Зы
xchgeaxeax писал(а):Вы правы, что NaN это состояние сопроцессора. Но формат Extended (10-ти байтовое) для x87 вполне может хранить NaN. Тогда как Double или Single такого не могут.
uses
SysUtils, Math;
var
d: Double;
s: Single;
begin
SetExceptionMask(GetExceptionMask + [exInvalidOp]);
d := Double.NaN;
s := Single.NaN;
SetExceptionMask(GetExceptionMask - [exInvalidOp]);
if d.IsNan then
WriteLn('Ich bin Double NaN!');
if s.IsNan then
WriteLn('Ich bin Single NaN!');
end.
Вернуться в Free Pascal Compiler
Сейчас этот форум просматривают: Google [Bot] и гости: 2