为什么我得到-0而不是0?

时间:2018-04-30 10:34:18

标签: c

我在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

2 个答案:

答案 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 == INFINITY1.0/-0.0 == -INFINITY。 (INFINITY-INFINITYNAN)也是浮点变量可以采用的值。

要让printf不为-0打印-0.0以及任何会被截断为0-0的小号,一种方法是人为地放置0.0的小值,例如:

if(abs(x) < 1e-5) x = 0.0;