【问题标题】:Store division of integers in float value C++将整数除法存储在浮点值 C++ 中
【发布时间】:2012-07-30 13:14:36
【问题描述】:

我只是想问一下,如果我在存储在这样的浮点变量中时不将整数类型转换为浮点数会发生什么:

int32 IntVar1 = 100
int32 IntVar2 = 200
float FloatVar = IntVar1/IntVar2;

目前我正在这样做:

int32 IntVar1 = 100
int32 IntVar2 = 200
float FloatVar = float(IntVar1)/float(IntVar2);

但就我拥有的代码量而言,这看起来真的很迟钝。我想过将我的 int 变量更改为浮点数,但我想这会影响性能。而且由于整数值不应该包含任何小数,所以感觉完全是浪费。

所以我想知道,选项 1 有什么方法可以工作吗?还是我必须进行类型转换或将变量更改为浮动? (所有类型转换几乎都使代码不可读)

【问题讨论】:

  • 是否更具可读性:float FloatVar = (float) IntVar1 / IntVar2; ?
  • 是的,但这是否会超越具有更多价值的部门?

标签: c++ casting floating-point int division


【解决方案1】:

我不会太担心过早的优化。如果将您的值表示为float 类型更有意义,那就去吧。如果您的程序没有按您需要的速度运行,并且您已经对其进行了分析并且知道浮点运算是问题所在,那么请开始考虑如何加快它的速度。

我更看重所有选角的可读性,这似乎也是你的本能。

另外,由于这个问题被标记为 C++,我认为它(不幸的是?)更符合习惯:

float FloatVar = static_cast<float>(IntVar1)/IntVar2

【讨论】:

  • 我猜你是对的,能够编辑你的代码很重要,呵呵!谢谢!你为什么要静态铸造?这样做有什么好处吗?
  • @LilleCarl 看这里:stroustrup.com/bs_faq2.html#static-cast 剧透警告:它更清楚地表达了你的意图,更容易搜索。
  • 另一个 C++ 变体:float(IntVar1)/IntVar2;构造函数样式。
  • @MSalters +1 -- 又一个选项!
【解决方案2】:

看看函数的魔力:

float div(int x, int y)
{
    return float(x) / float(y);
}

现在你可以说:

int32 IntVar1 = 100
int32 IntVar2 = 200
float FloatVar = div(IntVar1, IntVar2);

【讨论】:

  • 恕我直言,这最终会让我头疼,但我明白你的意思!谢谢你:)
【解决方案3】:

您至少需要其中一个操作数为浮点数,否则除法将被截断。我通常会转换第一个操作数:

float FloatVar = (float)IntVar1/IntVar2;

从优雅的角度来说,这还不错。

【讨论】:

  • 啊,所以只需类型转换一个然后其他整数会自动转换就足够了? (我宁愿使用 c++ 类型转换,c 风格的转换看起来不属于任何地方)
  • 可以说我想这样做: int IntVar = FloatVar1/FloatVar2;那么它们会在除法之前还是之后转换为int?
  • 谢谢埃里克,帮了我很多它是地板还是天花板?还是会“floor(value+0.5f)”?
  • @LilleCarl,它将向零或负无穷大舍入。这是实现定义的。
  • 负无穷大?所以它总是会向下取整(地板?)谢谢!:)
【解决方案4】:

根据 ISO/IEC 标准 - N3797 - 第 5.6 节

对于整数操作数, / 运算符产生代数商 丢弃任何小数部分;如果商 a/b 是 可以用结果的类型来表示,(a/b)*b + a%b 等于 a; 否则,a/b 和 a%b 的行为都是未定义的

丢弃小数部分称为向零截断

难怪小数部分被丢弃了

22/7

【讨论】:

    猜你喜欢
    • 2021-05-16
    • 1970-01-01
    • 2017-12-09
    • 2012-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-17
    相关资源
    最近更新 更多