error.qbk 3.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. [section:relative_error Relative Error]
  2. Given an actual value /a/ and a found value /v/ the relative error can be
  3. calculated from:
  4. [equation error2]
  5. However the test programs in the library use the symmetrical form:
  6. [equation error1]
  7. which measures /relative difference/ and happens to be less error
  8. prone in use since we don't have to worry which value is the "true"
  9. result, and which is the experimental one. It guarantees to return a value
  10. at least as large as the relative error.
  11. Special care needs to be taken when one value is zero: we could either take the
  12. absolute error in this case (but that's cheating as the absolute error is likely
  13. to be very small), or we could assign a value of either 1 or infinity to the
  14. relative error in this special case. In the test cases for the special functions
  15. in this library, everything below a threshold is regarded as "effectively zero",
  16. otherwise the relative error is assigned the value of 1 if only one of the terms
  17. is zero. The threshold is currently set at `std::numeric_limits<>::min()`:
  18. in other words all denormalised numbers are regarded as a zero.
  19. All the test programs calculate /quantized relative error/, whereas the graphs
  20. in this manual are produced with the /actual error/. The difference is as
  21. follows: in the test programs, the test data is rounded to the target real type
  22. under test when the program is compiled,
  23. so the error observed will then be a whole number of /units in the last place/
  24. either rounded up from the actual error, or rounded down (possibly to zero).
  25. In contrast the /true error/ is obtained by extending
  26. the precision of the calculated value, and then comparing to the actual value:
  27. in this case the calculated error may be some fraction of /units in the last place/.
  28. Note that throughout this manual and the test programs the relative error is
  29. usually quoted in units of epsilon. However, remember that /units in the last place/
  30. more accurately reflect the number of contaminated digits, and that relative
  31. error can /"wobble"/ by a factor of 2 compared to /units in the last place/.
  32. In other words: two implementations of the same function, whose
  33. maximum relative errors differ by a factor of 2, can actually be accurate
  34. to the same number of binary digits. You have been warned!
  35. [h4:zero_error The Impossibility of Zero Error]
  36. For many of the functions in this library, it is assumed that the error is
  37. "effectively zero" if the computation can be done with a number of guard
  38. digits. However it should be remembered that if the result is a
  39. /transcendental number/
  40. then as a point of principle we can never be sure that the result is accurate
  41. to more than 1 ulp. This is an example of what
  42. [@http://en.wikipedia.org/wiki/William_Kahan] called
  43. [@http://en.wikipedia.org/wiki/Rounding#The_table-maker.27s_dilemma]:
  44. consider what happens if the first guard digit is a one, and the remaining guard digits are all zero.
  45. Do we have a tie or not? Since the only thing we can tell about a transcendental number
  46. is that its digits have no particular pattern, we can never tell if we have a tie,
  47. no matter how many guard digits we have. Therefore, we can never be completely sure
  48. that the result has been rounded in the right direction. Of course, transcendental
  49. numbers that just happen to be a tie - for however many guard digits we have - are
  50. extremely rare, and get rarer the more guard digits we have, but even so....
  51. Refer to the classic text
  52. [@http://docs.sun.com/source/806-3568/ncg_goldberg.html What Every Computer Scientist Should Know About Floating-Point Arithmetic]
  53. for more information.
  54. [endsect][/section:relative_error Relative Error]
  55. [/
  56. Copyright 2006, 2012 John Maddock and Paul A. Bristow.
  57. Distributed under the Boost Software License, Version 1.0.
  58. (See accompanying file LICENSE_1_0.txt or copy at
  59. http://www.boost.org/LICENSE_1_0.txt).
  60. ]