C 如何提高浮点值的精度?
我正在写一个以4为基数的程序。我如何才能使价值更精确 我有一个十进制数字0.668,我把它转换成4进制。它应该是0.222300,但它存储为0.22299,这会给出非常不准确的结果,因为它应该是一个基数为4的数字。我读过关于浮点运算的书,但在c语言中找不到提高数字精度的方法。我已经尝试使用长双精度,但是我找不到打印长双精度值的方法。 我不知道这是否重要,但我使用mingw的代码块 编辑:C 如何提高浮点值的精度?,c,floating-point,C,Floating Point,我正在写一个以4为基数的程序。我如何才能使价值更精确 我有一个十进制数字0.668,我把它转换成4进制。它应该是0.222300,但它存储为0.22299,这会给出非常不准确的结果,因为它应该是一个基数为4的数字。我读过关于浮点运算的书,但在c语言中找不到提高数字精度的方法。我已经尝试使用长双精度,但是我找不到打印长双精度值的方法。 我不知道这是否重要,但我使用mingw的代码块 编辑: @EricPostphil已经回答了我的问题。看来您正在尝试使用“十进制编码的base-4”格式。也就是说,
@EricPostphil已经回答了我的问题。看来您正在尝试使用“十进制编码的base-4”格式。也就是说,给定一个以4为基数的数字(.222304),将其重新解释为十进制数字(.2223010),然后将十进制数字的数值存储在
浮点数
或双精度
中。然后,由于您使用的C实现使用基于二进制的浮点
或双精度
,因此最终会使用二进制表示,这当然会在从十进制数字的值转换时引入错误。对此的主要解决方案是:不要这样做。没有理由使用十进制
因为你有4进制的数字,只需把4进制的数字放在一些位上。选择一个无符号整数类型,并将其两个位用于每个基4位。或者,如果必须使用浮点,则对每个基4位使用浮点的两位。要在
float
或double
中表示.2223004,请将0除以4,再加上0,再除以4,再加上3,再除以4,再加上2,再除以4,再加上2,再除以4。结果将是精确的,然后您可以在float
或double
中进行本机运算。然后您只需要转换例程:一个用于将基4数字转换为内部格式的输入,另一个用于将内部格式转换为基4数字的输出。您使用的是double
?通常应该使用double
,除非您真正关心的是空间,而不是精度。除此之外,有些机器支持长双精度
数据类型,尽管这种数据类型的可移植性较差。如果没有性能限制,可以使用多精度库,如gmp。除此之外,编译器还依赖于底层硬件,这些硬件应该与IEEE754兼容。对你的精确性感到惊讶。应该比双精度更精确。0.22299 base-4是多少?base-40.2223
不是十进制的0.668
。十进制为0.66796875
。我认为十进制0.668
不能准确地存储在base 4中。@Aleksander如果您需要帮助,您需要在从base-10转换为base-4的位置发布代码