我在c中编写了一个代码,它给出了以三元组形式给出的逐点旋转
当我编译并运行测试用例时,它输出为-0,7
因为python中的相同代码将输出为0,7。
当我在在线编译平台上运行相同的代码时,它给了我正确的输出
我正在使用codeblocks windows 10 os
代码块有问题吗?
我该怎么办?
C代码:
#include<stdio.h>
#include<math.h>
int main()
{
double xp,yp,xq,yq,a,b,c;
double t,xn,yn;
int z;
scanf("%d",&z);
// printf("Enter coordinates of p \n");
scanf("%lf%lf",&xp,&yp);
// printf("\nEnter triple \n");
scanf("%lf%lf%lf",&a,&b,&c);
// printf("\nEnter coordinates of q \n");
scanf("%lf%lf",&xq,&yq);
t=asin(b/c);
if(z==0)
{
xn=xp*cos(t)-yp*sin(t)-xq*cos(t)+yq*sin(t)+xq;
yn=xp*sin(t)+yp*cos(t)-xq*sin(t)-yq*cos(t)+yq;
}
else
{
xn=xp*cos(t)+yp*sin(t)-xq*cos(t)-yq*sin(t)+xq;
yn=-xp*sin(t)+yp*cos(t)+xq*sin(t)-yq*cos(t)+yq;
}
printf("%lf %lf",xn,yn);
return 0;
}
输出:
0
4 7
3 4 5
2 3
-0.000000 7.000000
Process returned 0 (0x0) execution time : 10.675 s
Press any key to continue.
https://stackoverflow.com/questions/34088742/what-is-the-purpose-of-having-both-positive-and-negative-zero-0-also-written
答案 0 :(得分:3)
最可能的是,您实际上并没有签名-0.0
,但您的格式会以这种方式呈现给您。
如果你的一个计算产生一个舍入为零的负正常数,你将得到浮点有符号的负零。
如果确实有一个纯符号零,那么一个解决方法就是用三元条件运算符来破坏它,因为printf
确实保留了将有符号零传播到输出中的权利:f == 0.0 ? 0.0 : f
是一个这样的计划,甚至更闪亮,但模糊f ? f : 0.0
。 C标准将 -0.0
定义为等于0.0
。另一种方式(确认@EricPostpischil)是将0.0
添加到值中。
答案 1 :(得分:2)
对于浮点值,有两个零0.0
和-0.0
。它们相等(例如-0.0 == 0.0
返回1
),但它们是两个不同的值。它们存在对称性,因为对于0以外的任何小值,符号确实会产生数学差异。对于一些边缘情况,他们有所作为。例如1.0/0.0 == INFINITY
和1.0/-0.0 == -INFINITY
。 (INFINITY
,-INFINITY
和NAN
)也是浮点变量可以采用的值。
要让printf
不为-0
打印-0.0
以及任何会被截断为0
或-0
的小号,一种方法是人为地放置0.0
的小值,例如:
if(abs(x) < 1e-5) x = 0.0;