2016-08-18 5 views
3

У меня есть поле результата, указанное в качествеCompute: Предупреждать, когда младшее усечение происходит

01 MY-RESULT VALUE +0 USAGE COMP-3 PIC S9(13)V99 

Представьте себе, я перемножить два фактора:

COMPUTE MY-RESULT = A * B 

Что является лучшим способом для обнаружения усечения низкого порядка в MY-RESULT? . когда A=B=2.01.

Предложение ON SIZE ERROR не запускается.

+1

Это часть стандарта, чтобы сделать усечение низкого порядка. ROUNDED может немного изменить это значение (к стандарту 1985 года, пять или более в одной «дополнительной» десятичной позиции, приводит к добавлению к результату одной единицы наименьшей позиции, определенной в результате). Зачем вам нужно знать, мне никогда не нужно было знать. Вероятно, я бы сделал только умножение, если бы было известно, что это не приводит к усечению младшего порядка (либо умножится на нуль в десятичных разрядах, либо оба имеют нуль в десятичной позиции младшего разряда). –

ответ

3

Что-то, что будет работать со всеми поставщиками и даже с самыми старыми компиляторами (так как вы не указали какой-либо диалект, кажется, это самая важная часть): если имеет значение использование дополнительного целевого поля с более десятичными позициями и проверка равенства потом:

COMPUTE MY-RESULT RESULT-WITH-MORE-DECIMALS = A * B 
IF MY-RESULT NOT = RESULT-WITH-MORE DECIMALS 
    ... 
END-IF 

ON SIZE ERROR будет только отслеживаться для верхнего усечения.

Если функция 2014 ОС для вашего компилятора вы можете использовать INTERMEDIATE ROUNDING IS PROHIBITED (проект имел его в качестве ROUNDED-MODE PROHIBITED), который покажет вам эту проблему (если EC-SIZE-TRUNCATION исключение включена). Остерегайтесь одной части: это исключение из категории «фатальной» ...

+2

'ВЫЧИСЛИТЕЛЬНЫЙ РЕЗУЛЬТАТ РЕЗУЛЬТАТОВ РЕЗУЛЬТАТОВ МОИ-РЕЗУЛЬТАТОВ С БОЛЬШИМ-ДЕЦИМАЛЬНЫМИ = A * B, ЕСЛИ МОЙ РЕЗУЛЬТАТ НЕ РАВНО ДЛЯ РЕЗУЛЬТАТОВ С БОЛЬШЕ РАЗРЕШЕНИЙ ... END-IF' –

+0

@BillWoodger - я добавил фактический код и изменил это из явного 'MOVE' для использования двух целевых полей, как было предложено вами, - сохраняет одну строку' MOVE' –

+0

Хорошая идея с двумя целевыми полями! Не знал, что это возможно. Большое спасибо! –

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

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