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。忘记了。谢谢你的澄清。这些就是我讨厌浮点的原因;-)