【发布时间】:2011-06-12 17:53:34
【问题描述】:
当我在 Intel 机器上运行以下 C 代码时...
float f = -512;
unsigned char c;
while ( f < 513 )
{
c = f;
printf( "%f -> %d\n", f, c );
f += 64;
}
...输出如下:
-512.000000 -> 0
-448.000000 -> 64
-384.000000 -> 128
-320.000000 -> 192
-256.000000 -> 0
-192.000000 -> 64
-128.000000 -> 128
-64.000000 -> 192
0.000000 -> 0
64.000000 -> 64
128.000000 -> 128
192.000000 -> 192
256.000000 -> 0
320.000000 -> 64
384.000000 -> 128
448.000000 -> 192
512.000000 -> 0
但是,当我在 ARM 设备(在我的情况下是 iPad)上运行相同的代码时,结果却大不相同:
-512.000000 -> 0
-448.000000 -> 0
-384.000000 -> 0
-320.000000 -> 0
-256.000000 -> 0
-192.000000 -> 0
-128.000000 -> 0
-64.000000 -> 0
0.000000 -> 0
64.000000 -> 64
128.000000 -> 128
192.000000 -> 192
256.000000 -> 0
320.000000 -> 64
384.000000 -> 128
448.000000 -> 192
512.000000 -> 0
您可以想象,这种差异可能会在跨平台项目中引入可怕错误。我的问题是:
我认为将浮点数强制转换为 unsigned char 会在所有平台上产生相同的结果是错误的吗?
可能是编译器问题?
有没有优雅的解决方法?
【问题讨论】:
-
我对这些东西不是很了解,但我的第一反应是在任何架构上的任何平台上尝试将浮点数强制转换为无符号字符是个坏主意。
-
我不同意你的观点,布赖恩。精度在这里不是问题,但性能是。我正在使用 unsigned char 的“包装”性质保持在 0-255 边界内。这是,AFAIK(并且已经阅读了几篇文章)不是一种不常见的技术。
-
@Zmippie:您看到的行为是“饱和”性质,这在例如SIMD 指令集。
标签: iphone floating-point arm intel coercion