Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Math F#楼层功能不';你不能正常旋转吗?_Math_F#_Floor - Fatal编程技术网

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中不可精确表示而产生舍入问题。是的,我确实尝试过。不幸的是,结果没有任何变化。