C 为什么我得到的是-0而不是0?
我已经用c写了一个代码,它以三元组的形式给出了点的旋转角度。C 为什么我得到的是-0而不是0?,c,C,我已经用c写了一个代码,它以三元组的形式给出了点的旋转角度。 当我编译并运行测试用例时,它将输出为-0,7。 其中,python中的相同代码将我的输出设置为0,7。 当我在在线编译平台上运行相同的代码时,它会给出正确的输出。 我正在使用windows 10操作系统的代码块。 代码块有问题吗? 我该怎么办 C代码: #include<stdio.h> #include<math.h> int main() { double xp,yp,xq,yq,a,b,c;
当我编译并运行测试用例时,它将输出为-0,7。
其中,python中的相同代码将我的输出设置为0,7。 当我在在线编译平台上运行相同的代码时,它会给出正确的输出。
我正在使用windows 10操作系统的代码块。
代码块有问题吗?
我该怎么办 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.0
,但您的格式将以这种方式呈现给您
如果您的一个计算产生一个四舍五入为零的负次正常数,那么您将得到一个带符号的浮点负零
如果您确实有一个纯有符号零,那么一个解决方法是使用三元条件运算符将其删除,因为
printf
保留将有符号零传播到输出中的权利:f==0.0?0.0:f
是这样一种方案,或者甚至是更华丽但模糊的f?f:0.0
。C标准将-0.0
定义为等于0.0
。另一种方法(acknowledge@EricPostpischil)是将0.0
添加到值中。这里最有可能的事情是,您实际上没有签名的-0.0
,但您的格式正以这种方式呈现给您
如果您的一个计算产生一个四舍五入为零的负次正常数,那么您将得到一个带符号的浮点负零
如果您确实有一个纯有符号零,那么一个解决方法是使用三元条件运算符将其删除,因为
printf
保留将有符号零传播到输出中的权利:f==0.0?0.0:f
是这样一种方案,或者甚至是更华丽但模糊的f?f:0.0
。C标准将-0.0
定义为等于0.0
。另一种方法(acknowledge@EricPostpischil)是将0.0
添加到值中。对于浮点值,有两个零0.0
和-0.0
。它们比较相等(例如-0.0==0.0
返回1
),但它们是两个不同的值。它们是对称的,因为对于除0以外的任何小值,符号都会产生数学上的差异。对于某些边缘情况,它们会产生影响。例如1.0/0.0==INFINITY
和1.0/-0.0==-INFINITY
。(INFINITY
、-INFINITY
和NAN
)也是浮点变量可以采用的值
要使-0.0
的printf
不打印-0
,以及将被截断为0
或-0
的任何小值,一种方法是人为地将非常小的值放入0.0
,例如:
if(abs(x) < 1e-5) x = 0.0;
if(abs(x)<1e-5)x=0.0;
对于浮点值,有两个零0.0
和-0.0
。它们比较相等(例如-0.0==0.0
返回1
),但它们是两个不同的值。它们是对称的,因为对于除0以外的任何小值,符号都会产生数学上的差异。对于某些边缘情况,它们会产生影响。例如1.0/0.0==INFINITY
和1.0/-0.0==-INFINITY
。(INFINITY
、-INFINITY
和NAN
)也是浮点变量可以采用的值
要使-0.0
的printf
不打印-0
,以及将被截断为0
或-0
的任何小值,一种方法是人为地将非常小的值放入0.0
,例如:
if(abs(x) < 1e-5) x = 0.0;
if(abs(x)<1e-5)x=0.0;
您可能有“-0”,因为您的printf不打印小数部分,而您的实数是“-0.7”。因此,如果出现类似“if(-1-0.0
(例如printf(“%f”、-0.0);
)printf(“%lf%lf”,xn?xn:0.0,yn?yn:0.0)
我认为我没有实际签名0,但我的格式是这样显示的,因为您在注释中的解决方案不起作用。我现在该怎么办?我使用了在线编译器,它为相同的代码提供了正确的输出。那么到底出了什么问题?不需要使用三元运算符将-0更改为+0。只需添加0即可。(一条浮点指令,而不是测试、分支和移动/加载)但我怀疑这不是实际问题。更可能的结果是一个小的负值。它确实打印了-0.0
(例如使用printf(“%f”、-0.0);
)printf(“%lf%lf”,xn?xn:0.0,yn?yn:0.0)
我认为我没有实际签名0,但我的格式是这样显示的,因为您在注释中的解决方案不起作用。我现在该怎么办?我使用了在线编译器,它为相同的代码提供了正确的输出。那么到底出了什么问题?不需要使用三元运算符将-0更改为+0。只需添加0即可。(改为一条浮点指令