【问题标题】:Fortran sqrt of complex number -1 gives different results复数 -1 的 Fortran sqrt 给出不同的结果
【发布时间】: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 .负零的存在会触发错误。

标签: fortran complex-numbers


【解决方案1】:

Fortran 2008 (13.7.159) 为参数 X 定义了 sqrt 函数的结果,如(我的重点):

结果的值等于 X 的平方根与处理器相关的近似值。复数类型的结果是实部大于或等于 0 的主值。 当结果的实部为零时,虚部与X的虚部具有相同的符号。

你的平方根确实有零实部,所以让我们看看你的论点虚部的符号。 -(1,0) 的虚部是什么符号?如果您的处理器支持有符号零,那么它很可能是负数。在这种情况下,根据标准的要求,结果的虚部应该是负数。

在所有其他情况下,没有理由期望参数的虚部是负数,而不是正数,零。

【讨论】:

  • 哇!所以,如果我正在处理一个复杂的变量(比如a)并且在某些操作中(a)的实部变成了cero,我必须检查那个cero的符号以避免得到完全不同的结果?跨度>
  • 谢谢,我编辑了问题并包含了更多问题,但我只是在您的回答中得到了我正在寻找的解决方案。
猜你喜欢
  • 2019-04-30
  • 1970-01-01
  • 2020-08-10
  • 1970-01-01
  • 2018-06-04
  • 1970-01-01
  • 2017-08-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多