【问题标题】:C++ double pointer array to float conversionC++ 双指针数组到浮点数的转换
【发布时间】:2018-11-13 21:05:03
【问题描述】:

在c ++中将double转换为float的正确方法是什么。转换是隐式的吗?

问题 1: 考虑double d = 5.0;float f;

哪个是正确的?

  • f = d;
  • f = (float)d;
  • f = static_cast<float>(d);

问题 2: 现在考虑我们有

char *buffer = readAllBuffer(); 
double *d = (double*)(buffer + offset);
float f;

现在哪一个是正确的?

  • f = d[0];
  • f = (float)d[0];
  • f = static_cast<float>(d[0]);

提前致谢!

【问题讨论】:

  • 考虑到double 可以存储比float 更多的内容,它们都不是真正正确的,所以您可以完全降低精度或值
  • 这两个问题其实是一样的。无论哪种情况,您都从 double 值开始,并希望转换为 float 值。换句话说,您如何获取double 与将其转换为float 无关。
  • @NathanOliver 在这里失去精度不是问题。哪一个给我最接近的数字?因为我必须将双精度转换为浮点数?
  • @Mogi - 它们都会为您提供相同的 f 值。
  • @sebrockm:不一定;仅当原始数组是只读的并且程序尝试修改 d 指向的数据时。

标签: c++ c++11 type-conversion implicit-conversion


【解决方案1】:

它们都归结为同一个东西,而数组的使用是一个红鲱鱼。确实可以写

float f = d;

有些人认为static_cast 使代码更具可读性,因为它非常清晰。如果使用不那么冗长的形式,它还可以消除某些编译器可能发出的警告。

当然,因为doublefloat 的超集,您可能会丢失精度。最后,请注意对于

float f1 = whatever;
double d1 = f1;
float f2 = d1;

,C++ 标准坚持f1f2 必须是相同的值。

【讨论】:

  • static_cast 有助于消除有关从 double 截断为 float 的警告消息。我相信这是使用它的主要原因,而不是可读性
  • @Jeka:确实你是对的。我在所有构建中都明确禁止了所有此类警告。
【解决方案2】:

您确实有一个主要问题。这是不允许的:

double *d = (double*)(buffer + offset);

它违反了严格的别名和很可能的对齐要求。相反,您需要使用memcpy:

double d;
memcpy(&d, buffer + offset, sizeof d);
float f = d;

任何一个强制转换都可以替换最后一行,重要的变化是从取消引用类型和对齐不正确的指针到进行字节复制。

【讨论】:

  • 这取决于buffer + offset BTW 的真实类型。 (可以将double* 转换为char* 并恢复为double*)(函数名称表明并非如此)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-06
  • 1970-01-01
  • 2014-02-22
  • 2023-03-16
  • 1970-01-01
  • 2011-11-22
  • 2018-05-02
相关资源
最近更新 更多