Это сравнение печатает '0'b
. Не понимаю, почему ... Как я знаю, строки автоматически преобразуются в float
в PL/I, если необходимо.Почему сравнение не работает, как я подозреваю? PL/I
put skip list('-2.34e-1'=-2.34e-1);
Это сравнение печатает '0'b
. Не понимаю, почему ... Как я знаю, строки автоматически преобразуются в float
в PL/I, если необходимо.Почему сравнение не работает, как я подозреваю? PL/I
put skip list('-2.34e-1'=-2.34e-1);
Я испытал это в нашей среде (Enterprise PL/I V4.5 на г/OS) и нашел такое же поведение - при определенных параметрах компиляции.
Использование опции FLOAT(NODFP)
(т.е. не использовать встроенную поддержку десятичных чисел с плавающей точкой, я думаю, что вариант был введен с Enterprise PL/I V4.4) происходит следующее:
-2.34e-1
преобразуется его внутреннее представление в виде bin float(6)
, т.е. короткой двоичной плавающей точкой'-2.34e-1'
сравнивается со значением bin float(6)
, поэтому он должен быть преобразован в bin float
а-0.234
не имеет точного представления в виде двоичной фракции. Кажется, что компилятор преобразует его в bin float(54)
, то есть расширенное двоичное значение с плавающей запятой, чтобы получить максимальную точность.-0.234
имеет бесконечное число цифр после десятичной точки в своем двоичном представлении, но два преобразованных значения сохраняют различное количество цифр, значения не сравниваются.Под FLOAT(DFP)
(т.е. при использовании машины поддержки DFP)
-2.34e-1
является актуальной десятичной плавающей точкой и, таким образом, точное'-2.34e-1'
'1'b
Таким образом, ваша проблема представляет собой комбинацию компиляторов с различным выбором представления данных и возникающих ошибок округления с использованием двоичной с плавающей запятой различной точности.
Это демонстрирует одну из подводных камней сравнения равенства значений с плавающей запятой. @ piet.t благодарит вас за выполнение тестовых компиляций. Вы случайно включили опцию LIST и посмотрели на сгенерированный код? – zarchasmpgmr
Большое вам спасибо! Проблема оказалась достаточно сложной. Я думал, что ответ будет намного проще. –
Какой результат вы ожидали? Это точная, как в вставленном виде эмулятор, вы получили результат? –
@BillWoodger Я ожидал '1'b –
Какая у вас? PL1F под Геркулесом? PL/I Оптимизация компилятора? Другая реализация PL/1, такая как древний компилятор Digital Research CP/M 80? – zarchasmpgmr