Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.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
C 如何提高浮点值的精度?_C_Floating Point - Fatal编程技术网

C 如何提高浮点值的精度?

C 如何提高浮点值的精度?,c,floating-point,C,Floating Point,我正在写一个以4为基数的程序。我如何才能使价值更精确 我有一个十进制数字0.668,我把它转换成4进制。它应该是0.222300,但它存储为0.22299,这会给出非常不准确的结果,因为它应该是一个基数为4的数字。我读过关于浮点运算的书,但在c语言中找不到提高数字精度的方法。我已经尝试使用长双精度,但是我找不到打印长双精度值的方法。 我不知道这是否重要,但我使用mingw的代码块 编辑: @EricPostphil已经回答了我的问题。看来您正在尝试使用“十进制编码的base-4”格式。也就是说,

我正在写一个以4为基数的程序。我如何才能使价值更精确

我有一个十进制数字0.668,我把它转换成4进制。它应该是0.222300,但它存储为0.22299,这会给出非常不准确的结果,因为它应该是一个基数为4的数字。我读过关于浮点运算的书,但在c语言中找不到提高数字精度的方法。我已经尝试使用长双精度,但是我找不到打印长双精度值的方法。 我不知道这是否重要,但我使用mingw的代码块

编辑:
@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-4
0.2223
不是十进制的
0.668
。十进制为
0.66796875
。我认为十进制
0.668
不能准确地存储在base 4中。@Aleksander如果您需要帮助,您需要在从base-10转换为base-4的位置发布代码