2017-01-19 9 views
1

Это сравнение печатает '0'b. Не понимаю, почему ... Как я знаю, строки автоматически преобразуются в float в PL/I, если необходимо.Почему сравнение не работает, как я подозреваю? PL/I

put skip list('-2.34e-1'=-2.34e-1); 
+1

Какой результат вы ожидали? Это точная, как в вставленном виде эмулятор, вы получили результат? –

+0

@BillWoodger Я ожидал '1'b –

+0

Какая у вас? PL1F под Геркулесом? PL/I Оптимизация компилятора? Другая реализация PL/1, такая как древний компилятор Digital Research CP/M 80? – zarchasmpgmr

ответ

3

Я испытал это в нашей среде (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

Таким образом, ваша проблема представляет собой комбинацию компиляторов с различным выбором представления данных и возникающих ошибок округления с использованием двоичной с плавающей запятой различной точности.

+0

Это демонстрирует одну из подводных камней сравнения равенства значений с плавающей запятой. @ piet.t благодарит вас за выполнение тестовых компиляций. Вы случайно включили опцию LIST и посмотрели на сгенерированный код? – zarchasmpgmr

+0

Большое вам спасибо! Проблема оказалась достаточно сложной. Я думал, что ответ будет намного проще. –

 Смежные вопросы

  • Нет связанных вопросов^_^