固定C的精度

时间:2014-06-05 15:41:03

标签: c precision

C语言可以处理用户设置的精度计算吗?我知道 float double 类型不会完成这项工作,也不存在一些固定精度变量类型,就像我在 Java 或 C#

我之所以这样问,是因为我正在编写一个实现算法的程序,该算法计算 y = log x 的近似值,这需要进行固定精度算术终止并给出对数的正确近似值。我的程序终止,因为 float 具有最大精度,但答案包含的错误比我用铅笔和纸张尝试算法时要多。

例如,一旦指定了x,程序首先执行此声明:

float z = floor(x*pow(a, p-1) + offset)/pow(a,p);

其中a是一个整数,例如10,p是另一个整数,精度数,例如3.我用GDB发现,如果我们假设x = 4,则z不是0.4,因为它应该是,但它实际上是0.400000006

我知道这是浮点数和双精度数的正常行为,但在这个特定的程序中,我需要指定小数点后的确切位数,即p,如上所述。实际上,当程序终止时,x的对数用算法的固有误差计算,加上每次计算类似于上面的计算时浮点运算给出的误差。

那么,有没有办法可以手动设置变量的精度,以提高最终结果的准确性?

3 个答案:

答案 0 :(得分:4)

我建议GNU MPFR库进行精确的浮点计算。 GMP非常强大,专门用于大整数(mpzmpq或内部mpn类别),但是他们推荐这个库用于多精度浮点,甚至直接在他们的主要网站上:

  

新项目应该强烈考虑使用更完整的GMP   扩展库mpfr而不是mpf。

答案 1 :(得分:1)

如果您的目标是高精度数字,我建议使用GNU MP库。 Gnu多精度库允许您手动设置数字的精确度,从相当低的值飙升到巨大的千位数字。

这是链接。 https://gmplib.org/

我希望我有所帮助。

答案 2 :(得分:1)

您可能需要使用Arbitrary Precision Library来避免本机浮点/双精度的精度错误。该维基百科页面列出了三个支持浮点数的独立C库。