Float操作中的编程风格

时间:2011-12-16 09:55:32

标签: c++ delphi coding-style

我碰巧遇到一些类似的编程风格,主要是在 Float或Double操作时。

ratio = 1.0 * (top - bottom) / (right - left);  

所涉及的所有变量都是浮动的 将1.0乘以结果有什么意义?
根据我的想法,乘以1.0是一些额外的负担。因为结果不会改变。

或类似于编写具有and 1==1的条件。

P.S:在某些情况下,某些变量(比例除外)被指定为非Float / double值作为long或整数。

3 个答案:

答案 0 :(得分:8)

<强> C / C ++

当一个或多个变量topbottom等属于double类型时,乘以1.0是没有意义的。您应该删除它,因为它没有用处。当所有变量都是float类型时,乘以double文字1.0会强制使用双精度算术计算表达式。

另一方面,当所有变量都是整数时,乘以1.0会强制使用浮点运算执行计算。如果没有乘法,则将使用整数运算执行计算,这将产生不同的结果。

我的猜测是代码最初使用的是整数,需要1.0。在某个时间点,代码被更改为使用浮点变量,但现在没有删除现在的虚假乘法。

<强>的Delphi

如果你在Delphi代码中看到这样的表达式,那么你应该简单地删除乘法。存在除法运算符会强制将表达式计算为浮点表达式。

Delphi表达式评估的规则与C和C ++略有不同。在C和C ++中,单个符号/用于整数和浮点除法,表达式的上下文确定使用哪种除法形式。在Delphi /中是浮点除法,div是整数除法。

答案 1 :(得分:3)

在C ++中,经验法则是

  

如果操作涉及浮点类型,则两个操作数都将转换为浮点类型(结果为浮点类型)

请注意,operationoperator密切相关。并且操作的顺序由确定 operator precedence

在C ++中基本操作的优先级是非常自然的w.r.t.数学:

  • */发生在+之前,-
  • (中的表达式,)首先发生

所以,如果你有

float f = 1.0f + 1 / 2;

// then `f` will be `1.0f`, because

int   sub = 1 / 2     ;  // <- an integer division, happens first and gives 0
float f   = 1.0f + sub;  // <- 0 because the division result was evaluated first

最终结果是float类型,因为最后一项操作是float + int

另一个例子,涉及支撑表达式:

float f = (1.0f + 1) / 4;

// `f` will be `0.5` this time. The braced expressions happens first:

float sub = 1.0f + 1;  // float + int = float
float f   = sub / 4;   // float / int = float

请务必注意,44.0f的转换在操作之前发生,就像在此示例性程序集中一样:

// [mnemomic] [what]+ [target]
fload 1.0f, float_register_0
fload 1,    float_register_1
fadd  float_register_0, float_register_1, float_register_2 // sub is in [2]
fload 4,    float_register_3                               // 4 is in [3]
fdiv  float_register_2, float_register_3, f                // [2]/[3] -> f

记住

  

如果操作涉及浮点类型,则两个操作数都将转换为浮点类型(结果为浮点类型)

答案 2 :(得分:1)

在C ++中,1.0double,因此它会提高计算的精度。如果这是意图,那么明确地转换为double会更清楚。如果这是意图,它也不在表达式的理想位置(top-bottom将在精度增加之前进行评估。)

虽然可以假设它有其他原因,比如常量2.0,但随着时间的推移被微调到1.0,隐藏了这种乘法的原始原因。从您正在进行的计算来看,我认为情况并非如此。