为什么浮点数的十六进制表示法很少使用?
像0x0.01一样编写它们不是可以帮助避免一些意外吗,比如0.01突然变成了0.010000000000?
小数圆周率应该有多长才算准确?
似乎有这样一条指令FLDPI,它将pi直接加载到协处理器中,那么为什么要在代码中编写pi呢?arm也有同样的使用说明吗?
发布于 2013-09-03 00:05:05
好的,关于“π应该持续多久”这个问题。这些函数:
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如果它变得更短,结果会有所不同。
发布于 2013-09-03 04:06:47
我一直使用C99的十六进制表示法来表示浮点数,无论是输入还是输出。
使用十进制格式D.DDDDDDDDDDDDDDDDEXXX (小数点后的十六位数)可确保该表示法唯一标识任何double,包括最接近π的双精度。
像C这样的语言应该是可移植的,不应该依赖于一个特定的指令集可以做什么。旧的80位浮点指令也已经过时了,尽管它们对于使用80位long double显式计算的程序仍然很有用。在π的特殊情况下,3.141592653589793是获得正确double的最小十进制表示。此外,请注意,当程序中的常量恰好是指令加载的常量时,编译器始终可以生成指令FLDPI。然而,同样,80位FPU已经过时了,应该只被现代编译器用于长时间的双重计算。经过测试,即使在将0x3.243F6A8885A308D313198A2E03707344移动到long double时,GCC和Clang也不会生成FLDPI指令。差劲的…我几乎想要填写一份bug报告。
0x和p标记对于避免整数表示法的多义性是必要的。在十六进制中,这很简单:每个十六进制数字代表4位,一个普通的双精度数的形式是1.<52 binary digits>。因此,1.后面的13个十六进制数字非常重要。以十进制表示,标识double所需的数字最多为16位。要自己观察,请执行以下命令:
#include <stdio.h>
#include <math.h>
…
printf("%.16e\n%.16e\n", 1.0, nextafter(1.0, 2.0));看到较少的数字会造成混乱。
发布于 2013-09-02 22:09:56
考虑一下你在日常生活中的经历:你处理和遇到过十进制或指定为其他基数的实数吗?
你仍然会感到惊讶,因为在使用浮点值计算时,舍入和近似误差无论如何都会发生。
https://stackoverflow.com/questions/18575100
复制相似问题