代码之家  ›  专栏  ›  技术社区  ›  infoclogged

从float中删除小数部分但保留类型的有效方法

  •  0
  • infoclogged  · 技术社区  · 6 年前

    有没有办法,我可以保留的类型,仍然删除小数部分有效。

    示例-

    float a = 123.456;
    
    float b;
    
    b = do something on a;
    

    结果b为123.0

    2 回复  |  直到 6 年前
        1
  •  7
  •   Evg    6 年前

    例如,使用 std::round 保留原始类型:

    float round(float arg);
    double round(double arg);
    

    std::floor std::ceil

    下面是一些基准测试结果。

    Compiler     raw loop   std::ceil  std:floor  std::trunc  std::round
    --------------------------------------------------------------------
    gcc          8.36       8.20       8.19       8.21        32.95
    gcc(f)       2.88       8.20       8.20       8.20        11.01
    msvs         8.20       28.47      31.90      67.14       97.84
    msvs(f)      8.13       13.70      14.00      67.27       97.50
    

    gcc 7.3.0 msvs 2018 15.9.0 Core i7-4770

    Code . 编译选项:

    gcc: --std=c++17 -O3 -m64 -march=native -fno-tree-vectorize
    gcc(f): --std=c++17 -O3 -m64 -march=native -ffast-math -fno-tree-vectorize
    msvs: /fp:precise /fp:except /O2 /std:c++latest ...
    msvs(f): /fp:fast /fp:except- /O2 /std:c++latest ...
    

    坦率地说,我不认为这些结果是非常相关的(绝对值)本身。使用“快速数学”选项,某些函数只会简化为一条汇编指令 vroundss

        2
  •  4
  •   melpomene    6 年前

    退房 modf

    #include <cmath>
    
    float a = 123.456;
    float b, c;
    
    c = std::modf(a, &b);
    // c = 0.456
    // b = 123.0
    

    如果不需要,就不必使用返回值(小数部分)。

    或者(因为C++ 11) trunc :

    float b = std::trunc(a);