В 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│
└──┴────────┘

2 ответа

Решение

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

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

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

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

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

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

Это похоже на работу:

sqrt=: <.@%:
sqrt 99999999999999x

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

Другие вопросы по тегам