【问题标题】:Implicit casting Integer calculation to float in C++隐式转换整数计算以在 C++ 中浮动
【发布时间】:2011-01-27 19:40:56
【问题描述】:

是否有任何编译器具有将整数计算转换为隐式浮点的指令或参数。例如:

float f = (1/3)*5;
cout << f;

“f”是“0”,因为计算的常量(1、3、10)是整数。我想用编译器指令或参数转换整数计算。我的意思是,我不会像这样使用显式转换或“.f”前缀:

float f = ((float)1/3)*5;

float f = (1.0f/3.0f)*5.0f;

你知道任何 c/c++ 编译器有任何参数来执行这个过程而无需显式转换或“.f”吗?

【问题讨论】:

  • 如果你能做到这一点,你将改变底层语言的语义——这通常不是一个好主意。也许您会更喜欢一种完全不同的编程语言,它具有更符合您口味的 int/float 表达式语义?
  • 顺便说一句:在第二种情况下,只有常量 13 之一需要为浮点数。另一个常量和5 会自动提升。此外,您不需要将它们定义为float,双打将被隐式降级为浮动:float f = (1.0 / 3)*5 会成功(或5.0/3)。
  • @David:“5 会自动提升”,我的印象是当小于 int 的整数常量转换为 int 时,我们说它们被“提升”,但在所有其他情况下,我们只需说“转换”即可。
  • @Alexandros Gezerlis:你是对的。我误用了“促进”这个词。有积分提升和浮点提升(从floatdouble),但是当涉及积分和浮点时,它们被称为“转换”
  • 如果你不喜欢额外的.0f,就用f。 (1f/3f)*5f - 这很明显,但不碍事。就像其他人说的那样,(1f/3)*5 也可以。

标签: c++ floating-point integer implicit-conversion compiler-directives


【解决方案1】:

如果您不喜欢您提到的两种方法中的任何一种,您可能就不走运了。

您希望通过这个实现什么目标?任何执行“浮点除法”的专用运算符都必须在标记化后的某个时间点将整数转换为浮点数,这意味着您不会在执行时获得任何性能优势。

【讨论】:

  • 感谢您的回答,但这不是喜欢或不喜欢的问题。我们的项目很大,我们对任何整数运算都不感兴趣。我们通常会犯错误。因此,在每个代码提交到存储库之后,我们必须运行一个将整数常量转换为浮点常量 (.f) 的宏。如果我们有一个编译器代替我们完成这项工作,我们可以省去构建项目的步骤(运行宏)。
  • @Ziddiri - 如果你真的在你的代码中从来不需要一个整数常量,我认为在提交到存储库之前运行该检查会更有意义,before,不是之后。如果代码使用整数文字,则拒绝代码(或警告程序员)。当然,大多数用途都没有害处float f = 1; f += 5; f = 1/f;。只是偶尔会出错,所以我发现很容易出错,除非你完全避免使用整数文字。所以,始终如一地写float f = 1.0; f += 5.0; f = 1.0/f;,然后像f *= (3/2); 这样的错误代码将看起来错误。
  • 您的项目不使用单个 int?甚至不在 for 循环中?
  • @Poita,我们的宏脚本可以处理“for”循环。但有趣的是,除了“for”循环之外,大多数代码(大多数公式和使用该公式的计算)都使用浮点数、双精度数等。
【解决方案2】:

不,这两个选项是你最好的选择。

【讨论】:

    【解决方案3】:

    在 C++ 中,看到一堆数字值散布在代码中有点奇怪。一般来说,将任何像这样的“幻数”移动到它们自己的静态 const 浮点值被认为是最佳实践,这样可以解决这个问题。

    【讨论】:

    • 同样的做法可以而且应该应用于 C#。
    【解决方案4】:

    任何做你想做的事的编译器都不再是符合标准的 C++ 编译器。整数除法的语义已明确指定(至少对于正数而言),您打算更改它。

    这也很危险,因为它最终会应用于所有事物,并且您可能在某些时候拥有依赖于标准整数算术的代码,而这会默默地无效。 (毕竟,如果你有可以捕捉到它的测试,你大概会有捕捉到不需要的整数算术的测试。)

    所以,我得到的唯一建议是编写单元测试,进行代码审查,并尽量避免使用幻数(而是将它们定义为 const float)。

    【讨论】:

      猜你喜欢
      • 2021-06-11
      • 2022-01-20
      • 2021-08-11
      • 1970-01-01
      • 2017-08-29
      • 2014-11-15
      • 1970-01-01
      • 2011-06-17
      • 1970-01-01
      相关资源
      最近更新 更多