Math F#楼层功能不';你不能正常旋转吗?
我有一个非常奇怪的问题。下面是我的一段简单递归代码:Math F#楼层功能不';你不能正常旋转吗?,math,f#,floor,Math,F#,Floor,我有一个非常奇怪的问题。下面是我的一段简单递归代码: let float2cfrac x = let rec tofloat (lst : int list) (xi : float) = let qi = floor xi let ri = xi-qi printfn "%A %A %A %A" xi qi ri (1.0/ri) if ri > (floor 0.0) then
let float2cfrac x =
let rec tofloat (lst : int list) (xi : float) =
let qi = floor xi
let ri = xi-qi
printfn "%A %A %A %A" xi qi ri (1.0/ri)
if ri > (floor 0.0) then
tofloat (lst @ [int qi]) (1.0/ri)
else
lst
tofloat [] x
我不打算多解释我的代码,因为我遇到的问题似乎很基本。
印文将印制羲和齐,齐是简单的席席。
当看输出时,看起来软件一旦达到XI的整数,席函数就会删除1,而不是无所作为。
这是我对数字3.245的输出,只需几次计算,它就可以完成计算:
浮动2CFRAC 3.245
3.245 3.0 0.245 4.081632653
4.081632653 4.0 0.08163265306 12.25
12.25 12.0 0.25 4.0
4.0 3.0 1.0 1.0-在这里它变得一团糟。4.0的底数应该是4,对吗
1.0 1.0 4.035882739e-12 2.477772682e+11
2.477772682e+11 2.477772682e+11 0.2112731934 4.733208147
4.733208147 4.0 0.7332081468 1.363869188
如果有人对此或某些建议有任何解释,我们将不胜感激 一个众所周知的问题:浮点数的精度是有限的,因此通常不能指望通过不同方法进行相同的计算来产生相同的结果。总有一个误差范围
由此推论,您无法比较浮点数是否严格相等。您必须将它们的差异与一些非常小的数字进行比较。不使用浮点数可以避免浮点数的数值问题。这里的一个解决方案是将输入表示为有理数,即整数分子和整数分母,然后相应地调整公式
open System.Numerics
let number2cfrac (xNumerator : int) (xDenominator : int) =
let rec loop acc (xin : BigInteger) (xid : BigInteger) =
let qi = xin / xid
let rin = xin - (qi * xid)
printfn "%A %A %A %A" (float xin / float xid) qi (float rin / float xid) (float xid / float rin)
if rin <> BigInteger.Zero then
loop (int qi :: acc) xid rin
else
List.rev acc
loop [] (BigInteger(xNumerator)) (BigInteger(xDenominator))
> number2cfrac 3245 1000;;
3.245 3 0.245 4.081632653
4.081632653 4 0.08163265306 12.25
12.25 12 0.25 4.0
4.0 4 0.0 infinity
val it : int list = [3; 4; 12]
opensystem.Numerics
let number2cfrac(xNumerator:int)(xDenominator:int)=
让rec循环acc(xin:BigInteger)(xid:BigInteger)=
设qi=xin/xid
设rin=xin-(qi*xid)
printfn“%A%A%A%A”(浮点数xin/浮点数xid)qi(浮点数rin/浮点数xid)(浮点数xid/浮点数rin)
如果是一个整数,那么是零
循环(内部qi::acc)xid rin
其他的
List.rev acc
循环[](BigInteger(xNumerator))(BigInteger(xDenominator))
>编号为28CFRAC 3245 1000;;
3.245 3 0.245 4.081632653
4.081632653 4 0.08163265306 12.25
12.25 12 0.25 4.0
4.0 4 0.0无穷大
val it:int list=[3;4;12]
谢谢你的回答,你是说如果ri>0.00000?还是我完全误解了你的解释?0.00000
与刚才的0
一样。你应该做ri>=0.00001
。哇,这很有效。但我不确定我是否完全理解它。我怎么知道ri不小于0.00001,这是可能的?你是否尝试过比较abs(ri)>=Double.Epsilon
或任何你想要的精度。还有,看,还有。当see 4.0被四舍五入到3.0时,由于前面计算步骤中累积的四舍五入误差,“4.0”值实际上已被计算为3.9999999左右。printfn
代码包括从视觉上将3.9999999舍入到4.0的代码,因为这是人们期望看到的,但是floor
将其视为真正的3.9999999,因此它正确地舍入到3.0。您是否尝试过使用十进制
超过浮点
decimal
是类似于浮点的float
,但它是base10而不是base2,并且是96位的。这会使您获得更高的精度,并且不会因为诸如3.245
之类的数字在base2中不可精确表示而产生舍入问题。是的,我确实尝试过。不幸的是,结果没有任何变化。