【问题标题】:g++ double precision arm vs intelg ++双精度臂与英特尔
【发布时间】:2014-06-23 22:58:48
【问题描述】:

这是显示相同程序在 intel 和 ARM 中的输出的图像:

http://screencast.com/t/1eA64D4rF

两者都显示读取二进制文件的输出,其中第一列中的数字为双精度浮点格式。为什么我无法在 ARM 环境中获得正确的结果(例如 intel -- 41784.998495、41784.998623)与(-8.1974E+204f 等)?

我使用的arm处理器是:

Processor       : ARM926EJ-Sid(wb) rev 0 (v5l)

BogoMIPS        : 331.77

Features        : swp half thumb fastmult edsp java

CPU implementer : 0x41

CPU architecture: 5TEJ

CPU variant     : 0x0

CPU part        : 0x926

CPU revision    : 0

Cache type      : write-back

Cache clean     : cp15 c7 ops

Cache lockdown  : format C

Cache format    : Harvard
I size          : 32768
I assoc         : 1
I line length   : 32
I sets          : 1024
D size          : 32768
D assoc         : 1
D line length   : 32
D sets          : 1024

Hardware        : MV-88fxx81
Revision        : 0000
Serial          : 0000000000000000

我在 ARM 上的编译选项:g++ -Wall SC_SCID.cpp

如何在此处理器上正确读取双精度类型?是否需要启用任何编译器选项才能在 ARM 上正确处理双精度数字?

【问题讨论】:

标签: gcc g++ arm cross-compiling double-precision


【解决方案1】:

像 41784.998495 和 -8.1974E+204 这样的数字之间的差异很可能是字节顺序问题——英特尔处理器是小端,而 ARM 是大端。因此,如果您在一个上写入二进制文件并想在另一个上读取它,则需要对值进行字节交换。

【讨论】:

  • “ARM 是大端的”——嗯? ARM CPU 是 bi-endian,但默认情况下是 LE - 没有多少系统在 BE 模式下运行它们(尽管我并不是说这 不是 其中之一) .
  • 感谢两位的意见。解决方案确实是重新排列字节顺序。 double swap(double d) 987654323 double a; 987654325 unsigned char *src = (unsigned char *)&d; 987654327 dst[1] = src[5]; 987654329 dst[3] = src[7]; 987654331 dst[5] = src[1]; 987654333 dst[7] = src[3];`返回;`} [链接] (screencast.com/t/Qqf40iy4Kc)
  • 更多的双字交换。
【解决方案2】:

注意:这是一个 wiki 答案;任何人都可以编辑。

根据wikipediadouble 的 ARM softfp 仿真混合使用了大端和小端。对于整数类型,ARM926EJ 的原生格式绝对是little endian

阅读更多问题Would float point format be affected by big-endian and little endian?

【讨论】:

    猜你喜欢
    • 2023-03-23
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 2018-10-04
    • 2011-10-31
    • 1970-01-01
    • 2014-08-03
    • 2012-04-23
    相关资源
    最近更新 更多