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的对数用算法的固有误差计算,加上每次计算类似于上面的计算时浮点运算给出的误差。
那么,有没有办法可以手动设置变量的精度,以提高最终结果的准确性?
答案 0 :(得分:4)
我建议GNU MPFR
库进行精确的浮点计算。 GMP
非常强大,专门用于大整数(mpz
,mpq
或内部mpn
类别),但是他们推荐这个库用于多精度浮点,甚至直接在他们的主要网站上:
新项目应该强烈考虑使用更完整的GMP 扩展库mpfr而不是mpf。
答案 1 :(得分:1)
如果您的目标是高精度数字,我建议使用GNU MP库。 Gnu多精度库允许您手动设置数字的精确度,从相当低的值飙升到巨大的千位数字。
这是链接。 https://gmplib.org/
我希望我有所帮助。
答案 2 :(得分:1)
您可能需要使用Arbitrary Precision Library来避免本机浮点/双精度的精度错误。该维基百科页面列出了三个支持浮点数的独立C库。