3

%:我知道当我对一个不产生整数的数字求平方根 ( ) 时,我的答案是浮点数。我正在寻找<.平方根的下限 ( ) 以获得整数结果。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│
└──┴────────┘
4

2 回答 2

4

来自“C程序员的J:32”

关键是成语 <.@v(或 >.@v),其中 v 是您要应用的动词。当您编写 <.@v 代码时,解释器知道您只对结果的整数部分感兴趣,并且如果操作数是精确精度,解释器将精确计算结果的整数部分。

所以,你必须使用<.@%:

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

另请参阅字典 - 扩展和有理算术

<.@f 和 >.@f 在应用于扩展整数参数时产生扩展整数结果。

于 2015-05-14T19:21:33.607 回答
2

这似乎有效:

sqrt=: <.@%:
sqrt 99999999999999x

有关详细信息,请参阅 http://www.jsoftware.com/help/jforc/elementary_mathematics_in_j.htm

于 2015-05-14T19:15:40.550 回答