Math F#求uInt64的根
如何在F#中求a uInt64的平方根 我试过:Math F#求uInt64的根,math,f#,Math,F#,如何在F#中求a uInt64的平方根 我试过: sqrt(1UL)//类型“uint64”不支持运算符“sqrt” //及 1UL**0.5//类型“uint64”不支持运算符“Pow” 可以使用pown进行整数指数运算,但替换sqrt不起作用,因为幂只能是int pown 4 2//16 如果只需要平方根的整数部分,最好是为它定义自己的函数。对于您的情况(使用无符号长值),它可以如下所示: let rec sqrtul n = if n <= 0UL then 0UL els
sqrt(1UL)//类型“uint64”不支持运算符“sqrt”
//及
1UL**0.5//类型“uint64”不支持运算符“Pow”
可以使用pown
进行整数指数运算,但替换sqrt
不起作用,因为幂只能是int
pown 4 2//16
如果只需要平方根的整数部分,最好是为它定义自己的函数。对于您的情况(使用无符号长值),它可以如下所示:
let rec sqrtul n =
if n <= 0UL then 0UL else
let r2 = (sqrtul (n >>> 2)) <<< 1
let r3 = r2 + 1UL
if n < r3 * r3 then r2 else r3
可在线找到替代实现
如果您的目标是在所选类型允许的范围内获得完整的十进制值,则必须首先转换初始值。例如,如果需要浮点结果,请执行以下操作:
sqrt (float 1UL)
当我开始研究十进制sqrt算法时,我找到了一些答案。十进制允许任意精度,因此您可以将其用于任何数字类型 解决方案1:通过迭代控制精度()
让itrSqrt n maxIter=
让我们猜猜g i=
匹配
|0->g
|猜((g+(n/g))/2M)(i-1)
猜测(n/2M)最大值;;
解决方案2:带ε的控制精度(表示迭代之间的变化)()
让dSqrt(d:decimal)(epsilon:decimal):decimal=
让我们猜猜前面的=
如果前一个=0米,则为0米
其他的
让电流=(先前+d/先前)/2M
如果(abs(先前-当前)
为什么不直接转换为双精度
?请在发布之前考虑一下您的问题。您很快就会发现,您也不能取int
的平方根。这也会直接引出一个问题:int
或int64
的平方根是什么类型的?你希望它的行为如何?@charlesrodie我不是函数式程序员,所以我可能看不到你在说什么,但我绝对希望能够找到int的根。例如,sqrt(4)=2
或sqrt(3)=1.73…
。我希望它的行为像数学函数一样,我输入一个数字,然后输出一个数字,而不必显式地键入everything@NicoSchertler如果我没弄错的话,double是有符号的64位数字,uInt64是无符号的64位数字。因此,我认为uInt64可能无法正确地转换为double。当你说“我希望它的行为与数学函数类似”时,你所说的“数学函数”是什么类型的:即域和codomain.Hmm是什么。我在找完整的十进制值。我发现输入和输出类型必须相同很有趣。遗憾的是,铸造测试确实给我带来了精度问题。正因为如此,我不太愿意把它作为答案,但是如果你需要更高的精度,decimal
而不是float
或double
可能是最好的选择。可悲的是,decimal不支持sqrt,但是我发现了一个针对decimal的sqrt实现
sqrt (float 1UL)