Ada_Ru форум

Обсуждение языка Ада

floating point

Оставить новое сообщение

Сообщения

Vladimir Teplouhov
floating point
2006-12-01 15:08:31

Hello.

 

Кто-нить работал с плавающей точкой? Всмысле со всякими

особыми значениями вроде NAN, +- бесконечности и тп.

(это чтобы прерываний вообще не было при любых данных)

 

Если я правильно понял, как и в других языках надо просто

отрубить контроль переполнения и все, все остальное уже

сделано в сопроцессоре(IEEE 754?) и библиотеках?

(помню проверял еще на турбо 5.5 - в доке ничего не нашел,

но когда оператору writeln подсунул такое число он честно

напечатал "NAN")

 

Vladimir

Vladimir Teplouhov wrote:

 

Если я правильно понял, как и в других языках надо просто

отрубить контроль переполнения и все, все остальное уже

сделано в сопроцессоре(IEEE 754?) и библиотеках?

(помню проверял еще на турбо 5.5 - в доке ничего не нашел,

но когда оператору writeln подсунул такое число он честно

напечатал "NAN")

 

Вот что написано в документации на GNAT RM:

 

12.6: Note that the result of a floating point arithmetic operation in overflow and invalid situations, when the Machine_Overflows attribute of the result type is False, is to generate IEEE NaN and infinite values. This is the case for machines compliant with the IEEE floating-point standard, but on machines that are not fully compliant with this standard, such as Alpha, the `-mieee' compiler flag must be used for achieving IEEE confirming behavior (although at the cost of a significant performance penalty), so infinite and and NaN values are properly generated.

 

123. The result of a floating point arithmetic operation in overflow situations, when the Machine_Overflows attribute of the result type is False. See G.2.1(13). Infinite and NaN values are produced as dictated by the IEEE floating-point standard.

 

Note that on machines that are not fully compliant with the IEEE floating-point standard, such as Alpha, the `-mieee' compiler flag must be used for achieving IEEE confirming behavior (although at the cost of a significant performance penalty), so infinite and NaN values are properly generated.

 

Ну и естественно нельзя использовать:

 

`-gnatVf'

Validity checks for floating-point values. In the absence of this switch, validity checking occurs only for discrete values. If `-gnatVf' is specified, then validity checking also applies for floating-point values, and NaN's and infinities are considered invalid, as well as out of range values for constrained types. Note that this means that standard IEEE infinity mode is not allowed. The exact contexts in which floating-point values are checked depends on the setting of other options. For example, `-gnatVif' or `-gnatVfi' (the order does not matter) specifies that floating-point parameters of mode in should be validity checked.

On Fri, Dec 01, 2006 at 10:05:28PM +0300, Vadim Godunko wrote:

Вот что написано в документации на GNAT RM:

 

Вот небольшой примерчик:

 

with Ada.Text_IO;

 

procedure Float_Test is

Tiny : Float := 1.0e-10000;

begin

Ada.Text_IO.Put_Line ("Float'Machine_Overflows = "

& Boolean'Image (Float'Machine_Overflows));

 

if Tiny /= 0.0 then

Ada.Text_IO.Put_Line ("Tiny /= 0.0");

end if;

 

Ada.Text_IO.Put_Line ("Tiny=" & Float'Image (Tiny));

Ada.Text_IO.Put_Line ("Inf=" & Float'Image (1.0 / Tiny));

Ada.Text_IO.Put_Line ("Inf=" & Float'Image (Tiny / Tiny));

Ada.Text_IO.Put_Line ("Inf=" & Float'Image (Tiny / 0.0));

end;

 

 

 

 

$ gcc -c float_test.adb

float_test.adb:4:20: warning: floating-point value underflows to 0.0 float_test.adb:16:55: warning: division by zero

float_test.adb:16:55: warning: "Constraint_Error" will be raised at run time

gnatbind -x float_test.ali

gnatlink float_test.ali

 

$ ./float_test

Float'Machine_Overflows = FALSE

Tiny= 0.00000E+00

Inf= +Inf*******

Inf=NaN********

 

raised CONSTRAINT_ERROR : float_test.adb:16 divide by zero

 

 

 

--

Maxim Reznik

Новое сообщение:
Страницы: 1

Чтобы оставить новое сообщение необходимо Зарегистрироваться и Войти