这段代码
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支持吗?
代码
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吗?
非常感谢-
采取诸如此类的程序
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参数再次编写函数并给出一个隐藏二合一的接口,但我正在寻找一个不需要创建另一个函数的解决方案......可能只是修改现有的函数?
我正在玩一些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.为什么没有错误?我没有通过分配空间的边界吗?
在代码正常的情况下...为什么参考中的示例?在另一个(更可能的)案例中......有哪些风险?
谢谢!