相关疑难解决方法(0)

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

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

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

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

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

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

uint*_ts是可选的.

c c++ architecture

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

所有整数值都完美地表示为双精度数吗?

我的问题是,是否保证所有整数值都具有完美的双重表示.

请考虑以下打印"相同"的代码示例:

// Example program
#include <iostream>
#include <string>

int main()
{
  int a = 3;
  int b = 4;
  double d_a(a);
  double d_b(b);

  double int_sum = a + b;
  double d_sum = d_a + d_b;

  if (double(int_sum) == d_sum)
  {
      std::cout << "Same" << std::endl;
  }
}
Run Code Online (Sandbox Code Playgroud)

对于任何架构,任何编译器,任何值ab?保证这是真的吗?i转换为的任何整数是否double总是表示为i.0000000000000和不表示为,例如,i.000000000001

我尝试了其他一些数字并且它总是如此,但无法找到关于这是巧合还是设计的任何信息.

注意:这与这个问题(除了语言)不同,因为我添加了两个整数.

c++ precision double standards ieee-754

57
推荐指数
3
解决办法
8693
查看次数

假设使用C中的IEEE754浮点表示浮点数是否安全?

浮点是在C中定义的实现.因此没有任何保证.

我们的代码需要是可移植的,我们正在讨论在我们的协议中使用IEEE754浮点数是否可以接受.出于性能原因,如果我们不必在发送或接收数据时在固定点格式之间来回转换,那将是很好的.

虽然我知道平台和架构之间可能存在关于long或的大小的差异wchar_t.但我似乎无法找到任何具体的floatdouble.

到目前为止我发现字节顺序可能在大端平台上被反转.虽然有不带浮动包含代码,其中点支撑平台floatdouble甚至无法链接.否则平台似乎坚持IEEE754单精度和双精度.

那么可以假设浮点数在IEEE754可用时安全吗?

编辑:回应评论:

你对"安全"的定义是什么?

安全我的意思是,一个系统上的位模式在另一个系统上意味着相同(在字节旋转之后处理字节序).

c floating-point ieee-754

23
推荐指数
2
解决办法
1693
查看次数

从二进制文件读取时将big endian转换为little endian

我一直在寻找如何将big-endian转换为little-endians.但我找不到任何可以解决我问题的好处.似乎有很多方法可以进行这种转换.无论如何,以下代码在big-endian系统中正常工作.但是我应该如何编写转换函数,以便它也适用于little-endian系统?

这是一个功课,但它只是一个额外的,因为在学校运行大端系统的系统.这只是我很好奇,并希望它也可以在我的家用电脑上工作

#include <iostream>
#include <fstream>

using namespace std;

int main()
{
   ifstream file;

   file.open("file.bin", ios::in | ios::binary);

   if(!file)
      cerr << "Not able to read" << endl;
   else
   {
      cout << "Opened" << endl;

      int i_var;
      double d_var;

      while(!file.eof())
      {
         file.read( reinterpret_cast<char*>(&i_var) , sizeof(int) );
         file.read( reinterpret_cast<char*>(&d_var) , sizeof(double) );
         cout << i_var << " " << d_var << endl;
      }
   }
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

解决了

所以Big-endian VS Little-endian只是字节的逆序.我写的这个功能似乎无论如何都符合我的目的.我在这里添加它以防万一其他人将来需要它.这只是双倍,但是对于整数,要么使用建议的函数torak,要么可以通过使它仅交换4个字节来修改此代码.

double swap(double d)
{
   double a;
   unsigned char *dst = (unsigned …
Run Code Online (Sandbox Code Playgroud)

c++ binaryfiles endianness

18
推荐指数
2
解决办法
6万
查看次数

双 - IEEE 754替代品

根据以下网站:http: //en.cppreference.com/w/cpp/language/types

"双精度浮点型.通常是IEEE-754 64位浮点型".

它说"通常".C++可以double使用哪些其他可能的格式/标准?什么编译器使用IEEE格式的替代品?还是建筑?

c++ ieee-754

6
推荐指数
2
解决办法
2190
查看次数

现代通用计算机的C11中FLT_RADIX是不是2?

这几乎是我在标题中的问题.对于其他任何使用它似乎完全不自然.

在研究这个时,我发现有基础10的硬件支持的历史例子,以及IBM POWER6和系统z9的更现代的例子.即使在这些情况下,我也不知道FLT_RADIX在任何主流C编译器中是否会出现10.

我特别关注的是,我正在编写一个只能在通用计算机上运行的应用程序的代码,而且我想知道我是否可以在FLT_RADIX==2没有严重关注的情况下静态断言,就像我目前静态断言一样!(unsigned char)256.

c floating-point c11

5
推荐指数
1
解决办法
541
查看次数

为什么C/C99标准的作者没有为sizeof浮点类型指定..standard?

我注意到在windows和linux x86上,float是4bytes,double是8,但long xins分别是x86和x86_64上的12和16.C99应该用特定的整体尺寸打破这种障碍.

最初的技术限制似乎是由于x86处理器无法处理超过80位的浮点运算(加上2个字节来进行舍入),但为什么标准与int类型相比不一致?他们为什么不至少达到80bit标准化?

c programming-languages c99

3
推荐指数
1
解决办法
209
查看次数

为什么 char16_t 被定义为与 uint_least16_t 而不是 uint16_t 具有相同的大小?

阅读 C++17 草案 §6.9.1/5:

类型char16_tchar32_t分别表示不同类型的具有相同的大小,符号性,和对准如uint_least16_tuint_least32_t,分别在<cstdint>被称为底层类型。

现在参考 C11 草案 §7.20.1.2/2,这是 C 库继承的参考:

typedef 名称uint_leastN_t指定宽度至少为N 的无符号整数类型,这样具有较小大小的无符号整数类型至少具有指定的宽度。因此,uint_least16_t表示宽度至少为 16 位的无符号整数类型。

注意“至少”部分。这意味着char16_t实际上可能有例如 32 位,从而形成char16_t一个 UTF-16 原始数据的错误表示的数组。在这种情况下,将此类数组写入二进制文件将导致有效代码单元与 U+0000 字符交替。

是否有充分的理由char16_t根据uint_least16_t而不是来定义uint16_t?或者它只是标准中的一个缺陷?

c++ unicode types utf-16

3
推荐指数
1
解决办法
547
查看次数

如果落在浮点类型的无损范围内,两个整数的乘积是否会无损?

单精度双精度IEEE 754 Base 2 浮点值可以无损失地表示整数范围。

给定的产物A = BC,其中,BC是整数表示无损作为浮点值,是产品A总是无损如果它在数学上的浮点类型的无损范围内?

更具体地说,我们是否知道常见的现代处理器是否会确保计算乘积,以便整数乘积的行为如上所述?

编辑:为了澄清上面的链接,可以无损表示的整数范围在双精度中为 +-2 53,在单精度中为 +-16777216。

编辑:IEEE-754 要求将运算四舍五入到最接近的可表示精度,但我特别想知道现代处理器的行为

floating-point precision processor floating-accuracy

3
推荐指数
1
解决办法
119
查看次数

C 中有多少种浮点类型?

正如许多程序员都知道 C 中有几种浮点类型。到目前为止,我知道floatdoublelong double我不太确定它们是全部,因为我发现了几个定义,例如__DEC32_MAX__。起初我以为这是另一个名称,__FLT_MAX__但当我尝试打印它时,我意识到它是不同的(如下所示):

#include <stdio.h>

void main(void)
{
    __mingw_printf("flt    value: %e, size: %d\n", __FLT_MAX__, sizeof(__FLT_MAX__));
    __mingw_printf("dbl    value: %e, size: %d\n", __DBL_MAX__, sizeof(__DBL_MAX__));
    __mingw_printf("ldbl   value: %e, size: %d\n", __LDBL_MAX__, sizeof(__LDBL_MAX__));
    __mingw_printf("dec32  value: %e, size: %d\n", __DEC32_MAX__, sizeof(__DEC32_MAX__));
    __mingw_printf("dec64  value: %e, size: %d\n", __DEC64_MAX__, sizeof(__DEC64_MAX__));
    __mingw_printf("dec128 value: %e, size: %d\n", __DEC128_MAX__, sizeof(__DEC128_MAX__));
}

/* output:
flt    value: 3.402823e+038, size: 4
dbl    value: 1.797693e+308, size: 8
ldbl   value: 3.237664e-317, size: 16
dec32 …
Run Code Online (Sandbox Code Playgroud)

c floating-point types decimal

3
推荐指数
1
解决办法
476
查看次数

除IEEE754之外是否还有32位浮点表示

前言:

我目前正在尝试解密旧的二进制格式(在日本80年代中期到80年代后期开发),该格式将浮点值存储在4字节块中,而不是用IEEE754标准转换.我有一个程序为我转换值,所以我可以操纵二进制文件来更改存储的值并查看结果,但我无法弄清楚如何解释它们.

我确实解释了4个字节的每个可能的排列作为IEEE浮点数,但没有一个是正确的,所以我可以说它不是字节序问题,也不是我知道或可以在互联网上找到的浮点数表示.

我试图调查我使用的程序的程序集,但是我的汇编程序技能不够好,无法从中获取任何东西.

这里有些例子:

  • A0 78 2D 00 = 298.
  • A0 78 2D 01 = 1975.7
  • A0 78 2D 02 = 3653.4
  • A0 78 2C 00 = 291.4
  • A0 78 2C 02 = 3646.8

Actuall问题:

在IEEE754标准之外/之前是否还有其他(旧的)32位浮点表示?

floating-point binaryfiles data-conversion binary-data ieee-754

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

C浮点数的标准要求

在"C Primer Plus 5/e"一书中,我看到作者写道:

C标准规定浮子必须能够代表至少6个有效数字并且允许至少10^(-37)为 1的范围10^(+37).

但是为了这样做并同时使用自然大小,它将需要4个字节.所以事实上,人们的范围可以从10 ^( - 63)到10 ^(+ 63),参见

http://en.wikipedia.org/wiki/Floating_point#Internal_representation

所以我在脑海中提出了一个问题:为什么C标准选择范围的要求at least 10^(-37) to 10^(+37).当然,可能需要考虑计算速度.但除此之外,有没有理由不使用完整的32位空间?

c floating-point

0
推荐指数
1
解决办法
90
查看次数

1 /(1.0/0.0)在C中评估为零

在C中评估以下表达式时,输出为零而不是无穷大.但是根据C运算符优先级规则,输出应该是无穷大.

double a=1/(1.0/0.0);
printf("a : %.18le\n", a);
Run Code Online (Sandbox Code Playgroud)

请解释一下gcc编译器如何评估这个?

c operator-precedence

-1
推荐指数
1
解决办法
157
查看次数