近似浮点数的好方法

时间:2013-10-26 10:08:53

标签: delphi approximation

我有一个解决方程式的程序,有时候解x1x2是带有很多十进制数的数字。例如,当Δ = 201(Δ=判别)时,平方根给出一个浮点数。

我需要对该数字进行良好的近似,因为我还有一个将其转换为分数的函数。所以我想这样做:

 Result := FormatFloat('0.#####', StrToFloat(solx1)); 

solx1是双倍的。这样,数字'456,9067896'变为'456,90679'。

我的问题是:如果我以这种方式近似,456,9067896的分数是正确的(并且相同)如果我有456,90679

3 个答案:

答案 0 :(得分:5)

  如果我有456,9067896

456,90679的分数是正确的(并且相同)?

不,因为0.9067896不等于0.90679

但你为什么要围绕这些数字呢?让他们保持原样。缩短它们仅用于视觉表现。

答案 1 :(得分:2)

如果您担心结果的完整正确性,则根本不应使用浮点数,因为根据定义,浮点数是实数的四舍五入。只有32位浮点的前5-6个十进制数字通常是可靠的,由于机器错误,以下几个不可靠。

如果你想要完全精确,你应该使用符号数学(有理数和符号表示无理/虚数)。

答案 2 :(得分:2)

要比较具有给定精度的两个浮点值,只需使用SameValue()函数from Math unit或其sibbling CompareValue().

if SameValue(456.9067896, 456.90679, 1E-5) then ...

您可以指定比较的精度。

或者您可以使用currency值,该值具有4位数的固定算术精度。所以,它不会再有舍入问题了。但你不能用它做所有的数学计算(大数或小数都没有得到妥善处理):它主要用于会计计算。

你最好不要使用string表示来比较浮点数,因为它可能非常混乱,并且没有良好的舍入能力。