Why my double can contain a value below the machine epsilon?

前端 未结 3 1510
伪装坚强ぢ
伪装坚强ぢ 2021-01-14 00:40

I was solving an equation using double precision and I got -7.07649e-17 as a solution instead of 0.

I agree it\'s close enough that I can s

相关标签:
3条回答
  • 2021-01-14 01:01

    A common solution for the floating point precision problem is to define an epsilon value yourself and compare to that instead of zero.

    e.g.

    double epsilon = 0.00001;
    if (abs(value) < epsilon) // treat value as 0 in your code
    
    0 讨论(0)
  • 2021-01-14 01:08

    There are two different constants in this story. One is epsilon, which is a minimal value that when added to 1.0 produces a value different from 1.0. If you add a smaller value to 1.0 you will again get a 1.0, because there are physical limits to the representation of a number in a computer. But there are values that are less than epsilon and greater than zero. Smallest such number for a double you get with std::numeric_limits<double>::min.

    For reference, you get epsilon with std::numeric_limits<double>::epsilon.

    0 讨论(0)
  • 2021-01-14 01:15

    You are not guaranteed that rounding will take place at any particular time. The C++ standard permits the implementation to use additional precision pretty much anywhere it wants to and many real-world implementations do exactly that.

    0 讨论(0)
提交回复
热议问题