В J, как мне найти пол квадратного корня с целочисленным значением повышенной точности

Я понимаю, что когда я извлекаю квадратный корень (%:) из числа, которое не дает целого числа, мой ответ - число с плавающей запятой. Я ищу нижний предел (<.) квадратного корня, чтобы получить целочисленный результат. Есть ли у J встроенный способ добиться этого? Нужно ли мне прибегать к циклу, чтобы найти ответ?

Добавление нескольких запросов повышенной точности (x:), конечно, этого не делает.

   rootanddiffa =: 3 : '(y - root ^ 2);(root =. <. %: y)'
   rootanddiffa 24
┌─┬─┐
│8│4│
└─┴─┘
   rootanddiffa 26
┌─┬─┐
│1│5│
└─┴─┘
   rootanddiffa 99999999999999x
┌──┬────────┐
│_1│10000000│
└──┴────────┘
   rootanddiffb =: 3 : '(y - root ^ 2);(root =. x: <. x: %: y)'
   rootanddiffb 24
┌─┬─┐
│8│4│
└─┴─┘
   rootanddiffb 99999999999999x
┌──┬────────┐
│_1│10000000│
└──┴────────┘

person Dane    schedule 14.05.2015    source источник


Ответы (2)


Из «J для программистов на C: 32»:

Ключ - это идиома ‹. @ V (или>. @ V), где v - это глагол, который вы хотите применить. Когда вы кодируете ‹. @ V, интерпретатор знает, что вас интересует только целая часть результата, и если операнд имеет точную точность, интерпретатор точно оценит целую часть результата.

Итак, вы должны использовать <.@%::

rt2 =: 3 :'(y - root ^ 2);(root =. <.@%: y)'
rt2 99999999999999x
┌────────┬───────┐
│19999998│9999999│
└────────┴───────┘

См. Также Словарь - расширенная и рациональная арифметика

‹. @ F и>. @ F дают расширенные целочисленные результаты при применении к расширенным целочисленным аргументам.

person Eelvex    schedule 14.05.2015
comment
В J есть достаточно мудрости, и я просто знал, что должен быть способ сделать это. - person Dane; 14.05.2015

Кажется, это работает:

sqrt=: <.@%:
sqrt 99999999999999x

Для получения дополнительной информации см. http://www.jsoftware.com/help/jforc/elementary_matMathematics_in_j.htm

person Aky    schedule 14.05.2015