точные/неточные результаты, такие как sqrt и целые корни

Требования к реализации R6RS 3.4 гласят:

... Потенциально неточные операции, такие как sqrt, при применении к точным аргументам должны по возможности давать точные ответы (например, квадратный корень из точных 4 должен быть точным 2).

(1) Означает ли это, что (* 0 2.2) должно производить 0.0, но никогда не 0 в результате?

Однако это не требуется. ...

(2) Означает ли это, что в результате (/ 4 2) также может быть получено значение 2.0?

(3) Существуют ли реализации, которые таким образом предоставляют целые корни? Как вообще получить функциональность целых квадратных корней? (Вот указатель) ( Пожалуйста, не используйте рекурсивную/итеративную реализацию)


person false    schedule 30.12.2014    source источник
comment
В Racket (exact? (sqrt 4)), (exact? (* 0 2.2)) и (exact? (/ 4 2)) производят #t. Как и (exact? (/ 4 3)), поскольку 1 1/3 — точное число.   -  person uselpa    schedule 30.12.2014
comment
@LePetitPrince: со свежеустановленной Racket v6.1.1 (* (/ 0.0 0.0) 0) и (* 0 (/ 1 0.0)) и (/ 0 0.0) все производят 0 (таким образом, точно). Это нормально?   -  person false    schedule 30.12.2014
comment
Я ожидал, что (/ 0.0 0.0) вызовет исключение, но оно дает +nan.0, потому что (inexact? 0.0) равно #t. Остальное объясняется здесь.   -  person uselpa    schedule 30.12.2014
comment
FWIW, Guile дает разные результаты для некоторых выражений: (exact? (* 0 2.2)) равно #f, (* (/ 0.0 0.0) 0), (* 0 (/ 1 0.0)) и (/ 0 0.0) равно +nan.0, что мне кажется более логичным.   -  person uselpa    schedule 30.12.2014
comment
@LePetitPrince (/ 0 0.0) должен быть NaN. Но умножение чего-либо на точный нуль, с математической точки зрения, является точным нулем, поэтому реализациям Scheme разрешено (но не обязательно) учитывать это.   -  person Chris Jester-Young    schedule 30.12.2014
comment
@ChrisJester-Young Умножение числа на точный 0 равно 0. Умножение NaN на 0 должно оставаться NaN, потому что NaN волшебным образом не становится числом.   -  person uselpa    schedule 30.12.2014
comment
@LePetitPrince Правда, я думаю, что могу согласиться с этим в том смысле, что NaN означает, что я не знаю, что это за число, и это число потенциально может быть бесконечностью. Но, конечно, любое не бесконечное число, умноженное на точный 0, равно 0.   -  person Chris Jester-Young    schedule 30.12.2014
comment
@ChrisJester-Young: Вот что я пытаюсь понять. Если у вас есть значение с плавающей запятой, это значение по определению неточное. Это может произойти из-за каких-то неточных вычислений. На самом деле, может быть, это действительно должно быть NaN, но из-за округлений деление (/ zero zero) не дало такого результата.   -  person false    schedule 30.12.2014


Ответы (1)


R6RS имеет exact-integer-sqrt. Он возвращает два значения, квадратный корень и остаток. Вы можете отказаться от второго значения, если хотите.

Реализациям разрешено (но не обязательно) рассматривать (* 0 x) (умножение чего-либо на точный нуль) как точный нуль для любого x. См. описание R6RS процедуры *.

person Chris Jester-Young    schedule 30.12.2014