Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么我得到的是-0而不是0?_C - Fatal编程技术网

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

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;

我已经用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即可。(改为一条浮点指令