Почему (max (sin (/ 5 3)) (sqr 12)) в схеме /Dr. Ракетка (Beginning Student Language) оценена как неточная?
Я читал, как разрабатывать программы, и в упражнении 2.1.1 я должен:
Узнайте, есть ли у DrScheme операции для возведения в квадрат числа; для вычисления синуса угла; и для определения максимум двух чисел. - сек 2.2, из 2.1.1
Мой код:
(sin (/ 5 3))
(sqr 12)
(max (sin (/ 5 3)) (sqr 12))
И результат, когда я запустил программу:
#i0.9954079577517649
144
#i144.0
Я запутался в последнем выражении, где это максимум #i0.9954079577517649
а также 144
, Не должен ли быть ответ 144
или же 144.0
вместо #i144.0
?
1 ответ
Схема даст вам неточное число, если любой из входов в max
(или другие операции в этом отношении) неточны.
В документе по стандартам R5RS об этом говорится в разделе 6.2.5 Numerical operations
при обсуждении min
а также max
:
Примечание. Если какой-либо аргумент является неточным, то результат также будет неточным (если только процедура не может доказать, что погрешность недостаточно велика, чтобы повлиять на результат, что возможно только в необычных реализациях).
Теперь, возможно, нужно сделать 144
намного больше, чем 0.9954079577517649
но это будет зависеть от уровня неточности в этом последнем числе. Если погрешность составляет порядка миллиарда процентов, она может быть намного больше, чем 144
:-)
Раздел 6.2.2 Exactness
этого стандарта также имеет это:
Номера схем являются либо точными, либо неточными. Число является точным, если оно было записано как точная константа или было получено из точных чисел с использованием только точных операций.
Число является неточным, если оно было записано как неточная константа, если оно было получено с использованием неточных ингредиентов, или если оно было получено с использованием неточных операций.
Таким образом, неточность является заразным свойством ряда.
0.99
Это число является неточным, потому что синус и многие другие тригонометрические функции по своей сути являются неточными операциями. Результат max
неточно, потому что он имеет неточные данные.