Consider the following code:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <complex.h>
int main()
{
complex double aaa = INFINITY + 0*I;
printf("%.f + %.f*I\n", creal(aaa), cimag(aaa));
complex double bbb = 1.0/aaa;
printf("%.f + %.f*I\n", creal(bbb), cimag(bbb));
return EXIT_SUCCESS;
}
使用
gcc -std=gnu99 -lm
编译时,我期望输出为:
在Linux上这是正确的(在Scientific Linux 6.8使用gcc 4.4.7,Fedora 23使用gcc 5.3.1,Ubuntu 14.04.5使用gcc 4.8.4测试过)。inf + 0*I
0 + 0*I
然而,在OS X(使用clang-602.0.53的10.11.5版本)上输出为:
显然clang不符合C99标准(参考N1256,第G.5.1节;严格来说,这只是一种推荐做法,而不是一项标准)。inf + 0*I
nan + nan*I
__STDC_IEC_559_COMPLEX__
,这个宏在G.1节中被介绍。#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <complex.h>
int main()
{
complex double aaa = INFINITY + 0*I;
printf("%.f + %.f*I\n", creal(aaa), cimag(aaa));
complex double bbb = 1.0/aaa;
#ifndef __STDC_IEC_559_COMPLEX__
if(isnan(bbb))
{
bbb = 0; //or do some trick that has to do with the problem context
}
#endif
printf("%.f + %.f*I\n", creal(bbb), cimag(bbb));
return EXIT_SUCCESS;
}
但我不确定它是否稳健。有什么建议吗?
INFINITY
扩展为正无穷,可以通过输出的第一行或者调试器进行检查;2. 这里我使用INFINITY
只是为了提供一个 MWE(最小可行示例)。你也可以写一些溢出的内容,例如complex double aaa = 1.0/0.0;
,但结论不会改变;3. 如果这个方法不起作用,那真的没有意义,因为我已经测试过double
类型的替代方案(将所有的complex double
替换为double
,将函数creal
和cimag
去掉等等),它是有效的。 - Leo Fangprintf()
的表示方式可能并不完全相同。也许确定问题究竟是clang
还是体系结构的最好方法是使用gcc
在OSX上编译它。 - Havenardgcc
在OS X上进行编译,尽管默认情况下gcc
是clang/LLVM。我将尝试使用brew获取真正的gcc。 - Leo Fangclang-602.0.53
之后)表现如期,而LLVM/Clang 3.5.2则呈现所述行为。 - kdhp