В 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