小编ale*_*xis的帖子

Fortran sqrt的复数-1给出了不同的结果

这段代码

print *, sqrt(cmplx(-1))
print *, sqrt(cmplx(-1,0))
print *, sqrt((-1,0))
print *, sqrt(-(1,0))
Run Code Online (Sandbox Code Playgroud)

给了我这个输出

(0.00000000,1.00000000)
(0.00000000,1.00000000)
(0.00000000,1.00000000)
(0.00000000,-1.00000000)
Run Code Online (Sandbox Code Playgroud)

我相信正确的代数是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.)
Run Code Online (Sandbox Code Playgroud)

我明白了

(0.00000000,1.00000000)
(0.00000000,-1.00000000)
(-1.00000000,0.00000000)
(-1.00000000,-0.00000000)
Run Code Online (Sandbox Code Playgroud)

所以,似乎我的编译器支持real数字的负零.所以,我想在使用这样的变量时要小心:

complex             :: asd 
asd=(1.,0.)
print *, sqrt(-asd)
Run Code Online (Sandbox Code Playgroud)

在这里,我再次得到错误的结果,但零负面的事情更难以预测.我有这么多问题!你知道其他一些可能导致错误的例子吗?你有建议避免这个错误吗?你现在有一些编译器标志来关闭GCC编译器的负面cero支持吗?

fortran complex-numbers

5
推荐指数
1
解决办法
451
查看次数

从Fortran 90中的指针别名释放指针目标

代码

program asd

real,pointer        :: a,b,c

allocate(a)
a=2.0
b=>a
c=>a
deallocate(b) !
print *, associated(c,target=a) ! T

end program
Run Code Online (Sandbox Code Playgroud)

用intel编译器返回T. 我得出结论,"b"不是"a"的完全别名,因为我不能解除"a"取"b".所以我的问题是:如果我构造一个指针

function ptr
  real,pointer   :: var,ptr
  allocate(var)
  ptr=>var
end function
Run Code Online (Sandbox Code Playgroud)

可以在调用此函数后解除分配var吗?

非常感谢-

fortran pointers memory-management

3
推荐指数
1
解决办法
2644
查看次数

Fortran过程中可能有隐式类型

采取诸如此类的程序

function c(a,b)
  integer,parameter        :: dp=kind(2.0e0) 
  real(kind=dp),intent(in) :: a,b
  real(kind=dp)            :: c
  c=a+b
end function
Run Code Online (Sandbox Code Playgroud)

有没有办法在不同种类的同一程序中调用相同的函数?例如:

program help
  integer,parameter    :: sp=kind(2.0d0),dp=kind(2.0e0) 
  print *, c(2.0_dp,3.0_dp)
  print *, c(2.0_sp,3.0_sp)
end program
Run Code Online (Sandbox Code Playgroud)

我知道我可以c使用sp参数再次编写函数并给出一个隐藏二合一的接口,但我正在寻找一个不需要创建另一个函数的解决方案......可能只是修改现有的函数?

fortran deferred

2
推荐指数
1
解决办法
116
查看次数

此代码似乎附加了分配范围之外的字符

我正在玩一些cpp的基本内容.我是这种语言的新手...所以我警告我的问题可能没有正确制定.我感谢任何帮助.

事情是,在看了www.cplusplus.com/reference/cstdlib/malloc/中的例子之后,我发现了我自己的代码:

#include <stdio.h>

int main (void) {
  char *str;
  str = (char*) malloc(2);
  str[0] ='8';
  str[1] ='8';
  str[2] ='6';
  str[3] ='\0';
  printf ("%s\n",str);
}
Run Code Online (Sandbox Code Playgroud)

并编译:

gcc -O0 -pedantic -Wall test2.cpp
Run Code Online (Sandbox Code Playgroud)

(gcc版本4.7.2)

我没有错误和输出886.为什么我没有错误?我没有通过分配空间的边界吗?

我没有得到任何错误,我得到了输出886.为什么没有错误?我没有通过分配空间的边界吗?

在代码正常的情况下...为什么参考中的示例?在另一个(更可能的)案例中......有哪些风险?

谢谢!

c c++ string malloc

0
推荐指数
1
解决办法
71
查看次数