【发布时间】:2018-11-01 01:20:51
【问题描述】:
这段代码
print *, sqrt(cmplx(-1))
print *, sqrt(cmplx(-1,0))
print *, sqrt((-1,0))
print *, sqrt(-(1,0))
给我这个输出
(0.00000000,1.00000000)
(0.00000000,1.00000000)
(0.00000000,1.00000000)
(0.00000000,-1.00000000)
我相信正确的代数是sqrt(-1)=i。为什么最后一行的结果?
编译器版本为 GCC 7.3.0,在 Linux openSUSE 42.2 (x86_64) 上运行。
编辑
按照@francescalus 的回答,我尝试了更多案例:
print *, sqrt((-1,-0))
print *, sqrt((-1,-0.))
print *, (-1,-0)
print *, (-1,-0.)
我明白了
(0.00000000,1.00000000)
(0.00000000,-1.00000000)
(-1.00000000,0.00000000)
(-1.00000000,-0.00000000)
所以,我的编译器似乎支持real 数字的负零。所以,我想在使用这样的变量时要小心:
complex :: asd
asd=(1.,0.)
print *, sqrt(-asd)
这里我又得到了错误的结果,但零负值更难预测。我有很多问题!你知道其他一些可能导致错误的例子吗?你有什么建议可以避免这种错误吗?你现在有一些编译器标志来关闭对 GCC 编译器的负 cero 支持吗?
【问题讨论】:
-
请指定您的编译器、编译器版本和操作系统。
-
编译器版本为GCC 7.3.0,运行于Linux openSUSE 42.2 (x86_64)。我只是编辑问题以包含它。
-
GCC 4.8.5 也会发生同样的事情
-
请注意,这两个结果在数学上都是正确的。
i*i = -1和(-i)*(-i) = -1 -
是的!我只是在读这个。来自维基百科:“根的虚部的符号被认为与原始数字的虚部的符号相同,或者为零时为正”,所以这个定义正确的结果应该仍然是
i.负零的存在会触发错误。