作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试准确匹配在 x86_64 和 aarch64/arm64 上运行的应用程序之间的行为。但是,当 float 超出可能的整数范围时,它们的区别在于如何将 float 转换为整数。
考虑以下示例:
#include <stdio.h>
#include <cstdint>
void cast(float value) {
printf("uint32_t(%.2f) = %u\n", value, uint32_t(value));
}
int main() {
cast(4294967808.);
}
# output on x86_64: uint32_t(4294967808.00) = 512
# output on aarch64: uint32_t(4294967808.00) = 4294967295
x86_64 版本正在使用 cvttss2si对于转换,它包含了答案,尽管文档对此还不清楚。 Aarch64 正在使用 fcvtzu这是饱和的。
任何使两者对齐的解决方案都会很有趣,但理想情况下,我想在 clang 上设置一个编译器标志,以使 aarch64 版本的行为类似于 x86_64 版本(即使 aarch64 “更好”)
最佳答案
使用CPU指令fjcvtzs (或内在的 __builtin_arm_jcvt
)在 aarch64 上获得 x86 的行为。
(感谢@EOF 在评论中提供足够的信息让我找到答案)
关于c++ - 在 aarch64/arm64 上通过环绕将 float 转换为 int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66279679/
我是一名优秀的程序员,十分优秀!