【问题标题】:Simple math calculation different between C++ and LuaC++ 和 Lua 之间的简单数学计算不同
【发布时间】:2017-08-30 05:48:12
【问题描述】:

我是一名 Lua 开发人员,但最近开始学习 C++。

我注意到 C++ 处理数学计算的方式略有不同。我想知道是否有官方名称/解释为什么会发生这种情况,以及是否有办法让它变成我习惯的。

在Lua中,代码如下;

local a = ( 4 / 3 ) * 3.1415 * ( 5 * 5 * 5 )
print( a ) // This returns 523.58333

在 C++ 中

int a;
a = ( 4 / 3 ) * 3.1415 * ( 5 * 5 * 5 );
cout << a; // This returns 392

请注意,虽然等式的语法完全相同,但答案却不同。

谢谢:)

【问题讨论】:

  • 4/3 == 1 因为整数除法,使用4.0/3.0
  • 我认为他的意思是四舍五入到 1
  • 我注意到 C++ 处理数学计算的方式略有不同。 -- 还有 Java、C 和 C# 等。它们都会做你所遇到的事情C++ 代码——整数除法。
  • @CoryKramer 好吧,现在我觉得自己很笨哈哈。谢谢!
  • @kpjVideo 你不应该,当你开始精通其他语言时,你会发现每种语言的内部结构都非常不同

标签: c++ math lua


【解决方案1】:

更好的等效代码是:

float a;
a = ( 4 / 3.0 ) * 3.1415 * ( 5 * 5 * 5 );
cout << a;

注意我们如何在除法中使用3.0,所以它是浮点除法而不是整数除法

【讨论】:

    【解决方案2】:

    在 Lua 中你正在做浮点除法

    /: float division
    //: floor division
    

    结果是1.333 * 3.145 * (5 * 5*5) 这使它成为523.583

    在lua中做这样的事情

    local a = ( 4 // 3 )  => 1* 3.1415 * ( 5 * 5 * 5 )
    print( a )
    

    你会得到

    392.6875 because of (1)*3.1415*5*5*5
    

    因为 4//3(地板除法)将返回 1

    如果你想得到等同于 c++ int 的结果,请使用 floor

    local a = ( 4 // 3 ) * 3.1415 * ( 5 * 5 * 5 )
    print(math.floor(a))
    

    输出

    392
    

    而 c++ 已经严格基于类型

    【讨论】:

      【解决方案3】:

      尝试将 a 声明为 double 看看会发生什么... 这样,4/3 的计算结果为 1,3.14 的计算结果也为 3。这就是你的区别。

      【讨论】:

      • 这行不通。编译器不关心表达式在计算时将分配什么变量,因此4/3 将保持整数除法。
      • 这并不能解决问题,右手边将使用int 算法进行评估,直到* 3.14,但到那时为时已晚。
      • 我的立场是正确的。所以,4.0/3.0 AND 双(或浮点)声明是要走的路。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-03
      • 2018-08-20
      • 2017-09-17
      • 1970-01-01
      • 1970-01-01
      • 2019-07-28
      相关资源
      最近更新 更多