Ада: не может возвести в квадрат переменную с плавающей точкой - PullRequest
2 голосов
/ 20 марта 2012

Я столкнулся с удивительным поведением: я не могу взять square power переменной.Ada разрешает принимать square power фактического значения.Ниже приведен пример кода:

with Ada.Text_IO; use Ada.Text_IO;
with Ada.Long_Float_Text_IO;
with Ada.Float_Text_IO;
with Ada.Numerics.Long_Elementary_Functions;
use  Ada.Numerics.Long_Elementary_Functions;


procedure Test_power is

  testing : constant := -0.11603;


begin

  Ada.Text_IO.Put("Works fine with numerical value entered directly: ");
  Ada.Long_Float_Text_IO.Put (Item => -0.11603 ** 2.0, Fore => 3, Aft  => 5, Exp  => 0);  
  Ada.Text_IO.New_Line;
  Ada.Text_IO.New_Line;
  Ada.Text_IO.Put("This does not work: ");
  Ada.Long_Float_Text_IO.Put (Item => testing ** 2.0, Fore => 3, Aft  => 5, Exp  => 0);  

end Test_power;

output на экране:

Works fine with numerical value entered directly:  -0.01346

This does not work:


Execution terminated by unhandled exception
Exception name: ADA.NUMERICS.ARGUMENT_ERROR
Message: a-ngelfu.adb:96 instantiated at a-nlelfu.ads:18
Call stack traceback locations:
0x413ed5 0x42771d 0x427a2a 0x4010b4 0x401146 0x7c817075

Компиляция была сделана с использованием:

GPS 4.4.1 (20091215) hosted on i686-pc-mingw32
GNAT GPL 2010 (20100603)

Два вопроса:

(а) Что я делаю неправильно, когда беру testing ** 2.0?

(б) Квадрат -0.11603 положителен 0.01346.Так почему я также получаю отрицательный знак в моем первом выходе?

После некоторого дополнительного тестирования:

Если я беру только положительное значение 0.11603, то выводится (егоквадрат) дает

(a) -0.01346 (b) 0.01346

, что может означать, что часть проблемы связана с negative sign.

Большое спасибо ...

1 Ответ

3 голосов
/ 20 марта 2012

Оператор "**" вызывает Numerics.Operator_Error, когда левый операнд отрицательный или когда оба операнда имеют значение ноль.

Неразумно ожидать, что он будет работать, когда правильный операнд математически является точным целым числом, таким как 2.0, но для нецелых показателей математическим результатом является комплексное число, а Ada.Numerics.Generic_Elementary_Functions не обрабатывает действительные числа, которые бывают точные целые числа как особый случай.

Если все, что вы хотите сделать, это возвести квадрат в число, используйте встроенный оператор "**" с целым показателем. Другими словами, измените это:

testing ** 2.0

к этому:

testing ** 2
...