相关疑难解决方法(0)

标准委员会关心的异域架构

我知道C和C++标准留下了语言实现的许多方面 - 仅仅因为如果存在具有其他特征的体系结构,那么为它编写符合标准的编译器是非常困难或不可能的.

我知道40年前任何电脑都有自己独特的规格.但是,我不知道今天使用的任何架构:

  • CHAR_BIT != 8
  • signed 不是两个补充(我听说Java有这个问题).
  • 浮点不符合IEEE 754(编辑:我的意思是"不是IEEE 754二进制编码").

我问的原因是我经常向人们解释C++不强制要求任何其他低级方面如固定大小的类型.这很好,因为与其他语言不同,它使你的代码在正确使用时可以移植(编辑:因为它可以移植到更多架构而不需要模拟机器的低级方面,例如符号+幅度架构上的二进制补码算法) .但我感到很难过,我自己也无法指出任何特定的架构.

所以问题是:哪些架构具有上述属性?

uint*_ts是可选的.

c c++ architecture

149
推荐指数
7
解决办法
1万
查看次数

为什么Math.pow(0,0)=== 1?

我们都知道0 0是不确定的.

但是,javascript说:

Math.pow(0, 0) === 1 // true
Run Code Online (Sandbox Code Playgroud)

C++说同样的话:

pow(0, 0) == 1 // true
Run Code Online (Sandbox Code Playgroud)

为什么?

我知道:

>Math.pow(0.001, 0.001)
0.9931160484209338
Run Code Online (Sandbox Code Playgroud)

但为什么不Math.pow(0, 0)抛出错误呢?或者也许NaN会比...更好1.

javascript c++ language-agnostic pow

84
推荐指数
7
解决办法
1万
查看次数

任何真实的CPU都不使用IEEE 754吗?

我正在优化数值/统计库的排序函数,基于这样的假设:在过滤掉任何NaN并进行一些微调之后,可以将浮点数作为32位整数进行比较而不改变结果,并且可以将双精度数据进行比较64位整数.

这似乎加速了这些数组的排序大约40%,并且只要浮点数的位级表示是IEEE 754,我的假设就成立.是否存在人们实际使用的真实CPU(不包括在嵌入式设备中,这个库没有针对哪个)使用其他可能会破坏这种假设的表示?


sorting floating-point performance ieee-754

31
推荐指数
4
解决办法
6257
查看次数

C中类型的任何保证最小尺寸?

您是否可以对数据类型的最小大小做出任何假设?

到目前为止我所读到的内容:

  • char:1个字节
  • 短:2个字节
  • int:2个字节,通常为4个字节
  • 长:4字节

浮动???双???

float.hlimits.h系统是否相关?

c types cross-platform

12
推荐指数
4
解决办法
8264
查看次数

C++中的long double是IEEE的binary128的实现吗?

来自https://en.wikipedia.org/wiki/Long_double

在 C++ 中,long double指的是通常比双精度更精确的浮点数据类型。然而,与 C++ 的其他浮点类型一样,它不一定映射到 IEEE 格式。

...

使用 GNU C 编译器,long double无论该类型使用何种物理存储(可以是 96 位或 128 位),x86 处理器上的精度都是 80 位。在某些其他架构上,long double可以是double-double(例如在 PowerPC 上)或 128 位四倍精度(例如在 SPARC 上)。从 gcc 4.3 开始,x86 上也支持四倍精度,但作为非标准类型__float128而不是long double.

Linux 上的 gcc 默认为 80 位扩展精度;在一些 BSD 操作系统(FreeBSD 和 OpenBSD)上,双精度模式是默认的,长双精度操作被有效地减少为双精度。

另一方面,面向 x86 的英特尔 C++ 编译器默认启用扩展精度模式。在 OS X 上,long double 是 80 位扩展精度。

看起来确实long double可能不是 IEEE 的 binary128 的实现,但为什么不这样做呢?为什么在某些情况下默认使用 80 位表示?

floating-point double ieee-754 long-double c++11

7
推荐指数
1
解决办法
3563
查看次数

检查数字是+ -Inf还是NaN

出于鲁棒性原因,我想检查浮点数是IEEE-754 + -Inf还是IEEE-754 Nan.我的代码如下,我想知道它是否正确:

 #define PLUS_INFINITE          (1.0f/0.0f)
 #define MINUS_INFINITE         (-1.0f/0.0f)
 #define NAN                    (0.0f/0.0f)

 float Local_Var;
 /*F is a float numnber.*/
 if((unsigned long)(F) == 0x7f800000ul)
   {
    Local_Var = PLUS_INFINITE;
   }
 elseif((unsigned long)(F) == 0xff800000ul)
   {
    Local_Var = MINUS_INFINITE;
   }
   /*fraction = anything except all 0 bits (since all 0 bits represents infinity).*/
 elseif((((unsigned long)(F) & 0x007ffffful) != 0ul )
         &&((unsigned long)(F) == 0x7f800000ul))
        || 
        (((unsigned long)(F) & 0x807ffffful) != 0ul )
        &&
        ((unsigned long)(F) == 0xff800000ul))
   {
    Local_Var = NAN; 
   } …
Run Code Online (Sandbox Code Playgroud)

c

4
推荐指数
1
解决办法
7228
查看次数

在所有操作系统上,IEEE浮动和双重保证是相同的大小吗?

我正在研究OS便携式数据库系统.我希望我们的数据库文件是可移植的操作系统,以便客户可以自行决定将其数据库文件移动到其他类型的操作系统.由于这个用例,我需要我的数据类型在OS之间保持一致,我想知道IEEE浮点数和双数字是否保证在任何操作系统上都是相同的字节大小?

c++ floating-point portability posix

2
推荐指数
1
解决办法
857
查看次数