考虑以下 C 代码:
int c=((0xa3>>6)&0x1f)|0xc0;
printf("%d\n",c);
它正确打印出 194 ( 0xc2
)。如果我在 中写同样的东西wcalc
,结果是 195,或者0xc3
。这是某种精度错误吗?这是预期的行为吗?floor
和ceiling
功能不起作用......或者,更具体地说,floor
适用于 0xa3,但不适用于 ,0xa1
反之亦然。
任何帮助表示赞赏。谢谢。
你为什么要问而不是测试?把它分解。你从以下得到什么?
0xa3>>6
(0xa3>>6)&0x1f
((0xa3>>6)&0x1f)|0xc0
Enter an expression to evaluate, q to quit, or ? for help:
-> ((0xa3>>6)&0x1f)|0xc0
= 195
-> 0xa3>>6
= 2.54688
-> (0xa3>>6)&0x1f
= 3
-> ((0xa3>>6)&0x1f)|0xc0
= 195
->
看到那条线"= 2.54688"
。这对你来说是正确的吗?根据我的计算,0xa3>>6
应该给你 2,当and
用 编辑时0x1f
,它仍然是 2。
如果您尝试以下操作,您会发现它>>
没有给出整数结果:
Enter an expression to evaluate, q to quit, or ? for help:
-> 0xa3
= 163
-> 0xa3>>1
= 81.5
-> 0xa3>>2
= 40.75
->
实际上,wcalcx >> y
不将其视为整数移位运算符(它只是将移位的位从右侧移出),而是将 x 除以 2^y 的浮点除法。因此:
Enter an expression to evaluate, q to quit, or ? for help:
-> 0xa3>>6
= 2.54688
这解释了相对于 C 版本的差异,其中0xa3 >> 6
只是 2。
我是wcalc的作者;您必须使用 2.3.1 版(已过期近一年)。
您所看到的原因是 wcalc 在内部使用 mpfr 库中的任意精度浮点数,因此,它用于执行移位作为除法(因此可以处理诸如 1.5>>6 之类的事情)。2.4 版(2008 年 10 月发布)处理整数位移的方式略有不同,以产生类似 C 的结果(如您所料)。
对于它的价值,一个替代的命令行计算器是 bc (在我不公正的意见中,更旧,但使用起来更痛苦,并且没有那么多功能)。
这是一个整数运算,不涉及浮点精度问题。正确答案是准确的,正如您已经知道的,示例代码正确地报告了它。对我来说,这听起来像是“wcalc”(我不知道的工具)中的一个错误。