Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.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 零除误差?_C_Logical Operators - Fatal编程技术网

C 零除误差?

C 零除误差?,c,logical-operators,C,Logical Operators,我已尝试运行以下代码: int x = 0; double y = 1/2; if (y <= x || y/x < 1) y++; printf("%.2f", y); intx=0; 双y=1/2; 如果(y赋值double y=1/2;为y产生0,那么|是快捷方式(这意味着or的第二部分没有计算) 如果您希望y为0.5,请填写: double y = 1/2.0; y实际上是0: double y = 1/2; 上面是整数除法,所以结果是0。您需要的是: double y

我已尝试运行以下代码:

int x = 0;
double y = 1/2;
if (y <= x || y/x < 1)
y++;
printf("%.2f", y);
intx=0;
双y=1/2;

如果(y赋值
double y=1/2;
y
产生0,那么
|
是快捷方式(这意味着or的第二部分没有计算)

如果您希望y为0.5,请填写:

double y = 1/2.0;

y
实际上是0:

double y = 1/2;
上面是整数除法,所以结果是0。您需要的是:

double y = 1.0/2.0;

首先,正如大家所指出的,你给y赋值是因为
1/2
是2个整数的除法


在你的-错误-示例中,1和2是整数,y被指定为0,你的假设“第一个表达式
(y),首先感谢你。这个问题非常重要,但我还没有面对

首先,行“y=1/2”生成“y=0”,其次,“if Condition y/x”中的行表示0/0“结果未定义”。但是在“| |”中,如果左侧参数为真,则不需要测试其余参数(Condition)。因此它跳到“y++”,结果是1.00

但是如果我们写
如果(y/xTried交换了两个表达式。输出仍然是一样的?@Alok Save,
0啊是的,在我发布评论后不久就意识到了。请忽略我的评论。@drawar,我不是100%确定,但我想我记得除以0和int有一个陷阱。将x变成一个双精度,然后重试。我认为FPU抛出了异常但对于整数算术,它可能看起来不同。编译器选项也可以发挥作用。我向大家展示了,确实存在一些架构(例如ARM)和编译器,它们的整数除法结果是
0
,并且不会生成异常……或者可能是
y=0.5;
:-)你能给我们一个关于你的cpu架构和你正在使用的编译器的信息吗?如果你在做了建议的更改后仍然遇到同样的情况,这可能会起作用。我正在cygwin Windows环境下运行。我的cpu是i7-3612 QM。我使用的编译器是gcc 4.5.3。
双y=1f/2f;
:1/问题是tagged C,这是C中的一个语法错误。您最多可以编写
1.f
2.f
.2/更糟糕的是,
1.f/2.f
可以,但是
1.f/3.f
不同于
1.0/3.0
,您必须真正知道如何将
double
初始化为前者。@calcuoq您是对的。在过去的几个小时里,我认为Java编码太多了。:-)我删除了这一部分。关于你对
1.f/3.f
1.0/3.0
的区别的评论:我刚刚测试了这一点,并且可以确认它(尽管它似乎是小小数).你知道这种差异从何而来吗?因为同样的原因,
1/3
被计算为
int
1.f/3.f
被计算为单精度
float
,而
1/3.
被计算为双精度
double
。数字1和3可以精确地表示为单精度和双精度-精度和双精度IEEE 754数字,但比率不是。
double d=1./3;
d
设置为实数
1/3
的最接近的双精度近似值,而
double d=1.f/3.f;
d
转换为其最接近的单精度近似值
double
。浮点常量更有趣:@PascalCuoq啊,我明白了。实数的默认类型是double。忘记了。谢谢你的澄清。这些就是我讨厌浮点的原因;-)