【发布时间】:2018-05-26 02:44:54
【问题描述】:
在 NEON 内联汇编中,从 Signed int32 转换为 Float 后,数字不同。
这里打印了 Float 和 Signed int32 的输出:
它随机不同(不仅是每个偶数)。 save as sint32 和 as float 之间只有转换(没有任何其他操作)。
如何避免?谢谢
【问题讨论】:
标签: floating-point type-conversion arm inline-assembly neon
在 NEON 内联汇编中,从 Signed int32 转换为 Float 后,数字不同。
这里打印了 Float 和 Signed int32 的输出:
它随机不同(不仅是每个偶数)。 save as sint32 和 as float 之间只有转换(没有任何其他操作)。
如何避免?谢谢
【问题讨论】:
标签: floating-point type-conversion arm inline-assembly neon
浮点数只有 23 位分配给尾数,带有单独的符号位 (MSB)
因此,在 -2^24 ~ 2^24-1 窗口之外的任何 int32 都将在转换过程中失去精度。 (发生截断)
与 ARM/NEON 无关。
https://en.wikipedia.org/wiki/Single-precision_floating-point_format
【讨论】:
int32 失去精度并不完全正确;例如可以精确表示 2 的任何幂(低于 FLT_MAX),包括超出int32_t 可以容纳的范围的值。所有超出 24 位范围的 float 值都是整数。
单精度浮点数的有效位(小数部分)只有 24 位。 (显式存储 23 位;从指数和有效数组合推断出 1。)因此值大于 224 的整数必须四舍五入以适应浮点格式。
【讨论】:
解决了使用 NEON 指令转换为 64 位 int 再转换为 64 位浮点数的问题。
【讨论】:
double 精度浮点数吗? x86 SSE2 可以。
scvtf)。看起来它目前不支持打包的 32 位 int -> double,只支持标量(如 ARM32 VFP)。所以是的,与使用带有 sshll 指令的标量相比,首先转换为 64 位 int 可能是一个不错的选择。 (shll2 表示 16 字节向量的上半部分)。