Fortran real(REAL80) 和 C __float80 大小

问题描述 投票:0回答:1

考虑以下 C 代码:

#include <stdio.h>
#include <stdint.h>

int main()
{
  int16_t   i16;
  __float80 r80;
  printf("size of 16 bit integer: %u\nsize of 80 bit real: %u\n",
         sizeof(i16) * 8, sizeof(r80) * 8);
  return 0;
}

以及以下 Fortran 代码(我知道使用整数文字作为类型参数是不可移植的):

program test
  implicit none
  integer(2) :: i16
  real(10)   :: r80
  print '("size of 16 bit integer: ", i0, /, "size of 80 bit real: ", i0)', &
    &   storage_size(i16), storage_size(r80)
end program test

使用 gcc 和 gfortran,两者都会打印:

size of 16 bit integer: 16
size of 80 bit real: 128

问题:为什么80位浮点数是128位宽?

我认为这与内存对齐和优化有关。但是为什么 16 位整数是 16 位宽呢?

P.S. 其实,这与我的另一个问题有关。

c gcc floating-point fortran gfortran
1个回答
0
投票

你已经回答了你自己的问题:这是x86平台上的gcc/gfortran编译器的一个选择,以便有更好的对齐。

real(kind=10)
是一个 80 位浮点数,存储在 128 位上(48 位未使用)。

这样的选择是性能(128 位边界对齐)和存储(37.5% 浪费)之间平衡的结果。任何选择都是值得怀疑的。请注意,在 32 位上存储 16 位整数意味着 50% 的存储浪费,这是完全不可接受的。

© www.soinside.com 2019 - 2024. All rights reserved.