为什么在 Java 中pow(1, qNaN)是qNaN而在 IEEE 754 中pow(1, qNaN)是1?
爪哇:
System.out.println(Math.pow(1, Double.NaN)); // prints NaN (which is qNaN)
$ javac --version
javac 11.0.11
Run Code Online (Sandbox Code Playgroud)
IEEE 754-2008, 9.2.1 特殊值:
pow (+1, y) 对于任何 y 都是 1(即使是安静的 NaN)
案例 A:C11,6.6 常量表达式,语义,5:
如果在翻译环境中计算浮动表达式,则算术范围和精度应至少与在执行环境中计算表达式一样大。116)
这需要以下程序返回 0:
#include <float.h>
#define EXPR DBL_MIN * DBL_MAX
double d1 = EXPR;
double d2;
#pragma STDC FENV_ACCESS ON
int main(void)
{
d2 = EXPR;
return d1 == d2 ? 0 : 1;
}
Run Code Online (Sandbox Code Playgroud)
案例 B:C11,6.10.1 条件包含,语义,4:
这些字符常量的数值是否与表达式中(#if 或 #elif 指令除外)中出现相同字符常量时获得的值匹配是实现定义的。168)
它不需要以下程序返回 0:
#define EXPR 'z' - 'a' == 25
int main(void)
{
_Bool b1 = 0;
_Bool b2;
#if EXPR
b1 = 1;
#endif
b2 = EXPR;
return b1 == b2 …Run Code Online (Sandbox Code Playgroud) c constants language-lawyer c-preprocessor implementation-defined-behavior
简单的问题:如果一元运算符的优先级接近最高,那么为什么#and##运算符的计算顺序是未指定的?与 C 和 C++ 相关。
C11(6.10.3.2 # 运算符):
# 和 ## 运算符的计算顺序未指定。
C++,N4713(19.3.2 # 运算符):
# 和 ## 运算符的计算顺序未指定。
上下文:C 编译器在实现一致的同时故意不支持某些功能。可以吗?
\n一些例子。下面的所有编译器都是一致的实现(__STDC__定义为1)。然而:
gcc 不支持#pragma STDC FENV_ACCESS并出现问题warning: ignoring \xe2\x80\x98#pragma STDC FENV_ACCESS\xe2\x80\x99 [-Wunknown-pragmas]。然而, fenv.h 是一个标准头文件,#pragma STDC FENV_ACCESS ON标准要求支持 ,因为是on-off-switch :ON中的选择之一。ON OFF DEFAULT
msvc 不支持#pragma STDC FP_CONTRACT,而是支持它自己的版本#pragma fp_contract ( { on | off } )。但是,标准版本是#pragma STDC FP_CONTRACT { ON | OFF | DEFAULT }.
Cygwin 上的 gcc:sscanf 不处理十六进制浮点输入。libc 是标准的一部分。
\n问题:是否允许实现故意提供有限的功能(或其自己的此类功能版本),同时仍然符合实现? …
这段代码:
#include <stdio.h>
#include <stdbool.h>
int main(void)
{
bool flag = true;
printf("%s\n", "xxxzzz" + ( flag ? 3 : 0 ));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译时会-std=c11 -pedantic导致警告:
main.c:7:27: warning: adding 'int' to a string does not append to the string
[-Wstring-plus-int]
printf("%s\n", "xxxzzz" + ( flag ? 3 : 0 ));
~~~~~~~~~^~~~~~~~~~~~~~~~~~
main.c:7:27: note: use array indexing to silence this warning
printf("%s\n", "xxxzzz" + ( flag ? 3 : 0 ));
^
& [ ]
1 warning generated. …Run Code Online (Sandbox Code Playgroud)