据我了解,你可以得到NaN
,并Inf
通过这样做:
// this is no code, just IEEE-754 math n = 0 / 0 i = 1 / 0
现在,您可以像下面这样检查两个变量的字节表示形式:
void dumpdouble(double x) { unsigned char *p = (unsigned char *) &x; int k; #ifndef BIG_ENDIAN for(k = 0; k <8; k++) printf("%.2x", p[7-k]); #else for(k = 0; k <8; k++) printf("%.2x", p[k]); #endif printf("\n"); } int main(int argc, char *argv[]) { double n = (double) 0 / (double) atoi(argv[1]); double i = (double) 1 / (double) atoi(argv[1]); dumpdouble(n); dumpdouble(i); return 0; }
像这样启动程序:
./a.out 0
在带有Visual C 15 x64的Windows 7上,结果是这样的:
fff8000000000000 7ff0000000000000
现在我想知道的是:
使用任何$fff8000000000000
保证$7ff0000000000000
符合IEEE-754标准的C编译器和体系结构,使用64位双精度的0/0是否保证传递,使用64位双精度的1/0是否保证在任何符合IEEE-754的C编译器和体系结构上传递,或者是特定于机器/编译器/任何东西的I不能依靠那些产生上述结果的部门吗?
0 / 0
和1 / 0
是整数除法,导致不确定的行为,因此不提供任何保证。
C11 6.5.5p5-/运算符的结果是第一个操作数除以第二个操作数所得的商;%运算符的结果是余数。在这两个操作中,如果第二个操作数的值为零,则行为是不确定的。