为什么很少使用浮点数的十六进制表示? (还有一些问题)

时间:2013-09-02 14:04:31

标签: floating-point

为什么很少使用浮点数的十六进制表示?

不是像0x0.01那样写它们会有助于避免一些意外,例如0.01突然变成0.010000000000某些东西吗?

十进制pi应该多长时间才能准确?

似乎有这条指令FLDPI,它将pi加载到协处理器中,为什么你必须在代码中编写pi?手臂有相同的说明吗?

3 个答案:

答案 0 :(得分:1)

好的,关于“应该how多久”的问题。这些功能:

int main (void){printf("%.80f\n\n", 0x3.243F6A8885A308D313198A2E03707344A4093822299F31D0082EFA98p0 );}
int main (void){printf("%.80f\n\n", 3.14159265358979323846264338327950288419716939937510582097494459 );}
int main (void){printf("%.80f\n\n", 3.141592653589793 );}

打印完全相同的数字:

3.14159265358979311599796346854418516159057617187500000000000000000000000000000000

如果变短,结果会有所不同。

答案 1 :(得分:1)

我一直使用C99的十六进制表示法来表示浮点数,包括输入和输出。

使用十进制格式D.DDDDDDDDDDDDDDDDEXXX(小数点后十六位)保证符号唯一标识任何double,包括最接近π的双精度。

像C这样的语言是可移植的,不应该依赖于某个特定指令集可以做什么。旧的80位浮点指令也已经过时了,尽管它们对于使用80位long double显式计算的程序仍然有用。 在π的特殊情况下,3.141592653589793是获得正确double的最小十进制表示。 另请注意,当程序中的常量完全是指令将加载的常量时,编译器始终可以生成指令FLDPI。但是,80位FPU已经过时,只能由现代编译器用于长双精度计算。经过测试,即使将FLDPI移动到0x3.243F6A8885A308D313198A2E03707344,GCC和Clang都不会生成long double指令。 Lame ......我几乎想填写错误报告。

0xp标记是必要的,以避免使用整数表示法出现歧义。在十六进制中,它非常简单:每个十六进制数字代表4位,普通双数字形式为1.< 52二进制数字>。因此,1.之后正好有13个十六进制数字。在十进制中,识别double所需的最多16位数字。要自己观察,请执行:

#include <stdio.h>
#include <math.h>
…
printf("%.16e\n%.16e\n", 1.0, nextafter(1.0, 2.0));

看到更少的数字会引起混淆。

答案 2 :(得分:0)

考虑你在日常生活中的经历:你是否处理并遇到十进制的实数或指定给任何其他基数?

由于四舍五入,你仍然会出现惊喜,无论如何都会出现带有浮点值的计算中的近似误差。