Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/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
F#(和.NET)中的浮点精度_F#_Floating Point - Fatal编程技术网

F#(和.NET)中的浮点精度

F#(和.NET)中的浮点精度,f#,floating-point,F#,Floating Point,在“”中,Jon Harrop说: 粗略地说,int类型的值近似于实数 最小整数和最大整数之间的数字,恒定绝对误差为+-1/2 而float类型的值具有近似恒定的相对误差 是百分之一的一小部分 现在,这是什么意思?Int类型不准确 为什么C#for(1-0.9)返回0.1,而F#返回0.09999988?C#是否更准确,更适合科学计算 我们应该使用十进制值而不是双精度/浮点值进行科学计算吗 不,F#和C#使用相同的双精度类型。浮点几乎总是不精确的。整数是精确的 更新: 你看到差异的原因是数字的打

在“”中,Jon Harrop说:

粗略地说,int类型的值近似于实数 最小整数和最大整数之间的数字,恒定绝对误差为+-1/2 而float类型的值具有近似恒定的相对误差 是百分之一的一小部分

现在,这是什么意思?Int类型不准确

  • 为什么C#for(1-0.9)返回0.1,而F#返回0.09999988?C#是否更准确,更适合科学计算

  • 我们应该使用十进制值而不是双精度/浮点值进行科学计算吗

  • 不,F#和C#使用相同的双精度类型。浮点几乎总是不精确的。整数是精确的

    更新:


    你看到差异的原因是数字的打印,而不是实际的表示。

    第一点,我想说的是,
    int
    可以用来表示整数范围内的任何实数,最大误差为[-0,5,0.5]。这是有道理的。例如,pi可以用整数值3表示,误差小于0.15


    浮点数不共享此属性;它们的最大绝对误差与您试图表示的值无关。

    3-这取决于计算:有时float是一个不错的选择,有时可以使用int。但是,当您对float和decimal中的任何一个都缺乏精度时,会有一些任务

    反对使用int的原因:

    > 1/2;; 
    val it : int = 0
    
    > decimal 1E-100;;
    val it : decimal = 0M
    
    反对使用float(在C#中也称为double)的原因如下:

    反对BCL十进制的原因:

    > 1/2;; 
    val it : int = 0
    
    > decimal 1E-100;;
    val it : decimal = 0M
    
    列出的每种类型都有自己的缺点

  • 对于任意实数,整数类型或浮点类型只能提供近似值。积分近似值在一个方向或另一个方向上的偏移量永远不会超过0.5(假设实数符合该积分类型的范围)。浮点近似值的偏差永远不会超过一个小百分比(同样,假设实数在该浮点类型支持的值范围内)。这意味着对于较小的值,浮点类型将提供更接近的近似值(例如,在浮点中存储PI的近似值将比int近似值3精确得多)。然而,对于非常大的值,积分类型的逼近实际上会比浮点类型更好(例如,考虑值9223、37、368、54、775、806、7,当表示为922337203685477580长时,其值仅为0.3,但当存储为浮点时,表示为9223、37、368、54、800、800、100)。

  • 这只是您如何打印值的一个人工制品。9/10和1/10不能精确地表示为浮点值(因为分母不是二的幂),正如1/3不能精确地表示为十进制(得到0.333…其中3永远重复)。无论您使用何种.NET语言,该值的内部表示形式都将是相同的,但打印该值的不同方式可能会以不同方式显示它。请注意,如果在FSI中计算1.0-0.9,结果将显示为0.1(至少在我的计算机上)

  • 你在科学计算中使用哪种类型将完全取决于你想要达到的目标。你的答案通常只是大致准确。你需要多精确?您的性能要求是什么?我认为decimal类型实际上是一个定点数字,这可能使它不适用于涉及非常小或非常大的值的计算。还请注意,F#包括任意精度的有理数(具有BigNum类型),这可能也适用于您的输入


  • MSDN声明它是System.Double: