我碰巧遇到一些类似的编程风格,主要是在 Float或Double操作时。
ratio = 1.0 * (top - bottom) / (right - left);
所涉及的所有变量都是浮动的
将1.0
乘以结果有什么意义?
根据我的想法,乘以1.0
是一些额外的负担。因为结果不会改变。
或类似于编写具有and 1==1
的条件。
P.S:在某些情况下,某些变量(比例除外)被指定为非Float / double值作为long或整数。
答案 0 :(得分:8)
<强> C / C ++ 强>
当一个或多个变量top
,bottom
等属于double
类型时,乘以1.0
是没有意义的。您应该删除它,因为它没有用处。当所有变量都是float
类型时,乘以double
文字1.0
会强制使用双精度算术计算表达式。
另一方面,当所有变量都是整数时,乘以1.0
会强制使用浮点运算执行计算。如果没有乘法,则将使用整数运算执行计算,这将产生不同的结果。
我的猜测是代码最初使用的是整数,需要1.0
。在某个时间点,代码被更改为使用浮点变量,但现在没有删除现在的虚假乘法。
<强>的Delphi 强>
如果你在Delphi代码中看到这样的表达式,那么你应该简单地删除乘法。存在除法运算符会强制将表达式计算为浮点表达式。
Delphi表达式评估的规则与C和C ++略有不同。在C和C ++中,单个符号/
用于整数和浮点除法,表达式的上下文确定使用哪种除法形式。在Delphi /
中是浮点除法,div
是整数除法。
答案 1 :(得分:3)
在C ++中,经验法则是
如果操作涉及浮点类型,则两个操作数都将转换为浮点类型(结果为浮点类型)
请注意,operation
与operator
密切相关。并且操作的顺序由确定
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
请务必注意,4
到4.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.0
是double
,因此它会提高计算的精度。如果这是意图,那么明确地转换为double
会更清楚。如果这是意图,它也不在表达式的理想位置(top-bottom
将在精度增加之前进行评估。)
虽然可以假设它有其他原因,比如常量2.0
,但随着时间的推移被微调到1.0
,隐藏了这种乘法的原始原因。从您正在进行的计算来看,我认为情况并非如此。