相关疑难解决方法(0)

浮点数学是否破碎?

请考虑以下代码:

0.1 + 0.2 == 0.3  ->  false
Run Code Online (Sandbox Code Playgroud)
0.1 + 0.2         ->  0.30000000000000004
Run Code Online (Sandbox Code Playgroud)

为什么会出现这些不准确之处?

language-agnostic math floating-point floating-accuracy

2798
推荐指数
28
解决办法
28万
查看次数

何时使用`std :: hypot(x,y)`而不是`std :: sqrt(x*x + y*y)`

该文件std::hypot说:

计算x和y的平方和的平方根,在计算的中间阶段没有过度溢出或下溢.

我很难设想一个std::hypot应该用于琐碎的测试用例sqrt(x*x + y*y).

以下测试表明,这std::hypot比天真计算慢大约20倍.

#include <iostream>
#include <chrono>
#include <random>
#include <algorithm>

int main(int, char**) {
    std::mt19937_64 mt;
    const auto samples = 10000000;
    std::vector<double> values(2 * samples);
    std::uniform_real_distribution<double> urd(-100.0, 100.0);
    std::generate_n(values.begin(), 2 * samples, [&]() {return urd(mt); });
    std::cout.precision(15);

    {
        double sum = 0;
        auto s = std::chrono::steady_clock::now();
        for (auto i = 0; i < 2 * samples; i += 2) {
            sum += std::hypot(values[i], values[i + 1]);
        } …
Run Code Online (Sandbox Code Playgroud)

c++ floating-accuracy c++11

26
推荐指数
1
解决办法
5306
查看次数