Advertisement
Guest User

Untitled

a guest
Jul 21st, 2017
51
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.92 KB | None | 0 0
  1. #include <cstdint>
  2. #include <iterator>
  3. #include <type_traits>
  4.  
  5. template<typename RandomAccessIterator>
  6. auto average(RandomAccessIterator first, RandomAccessIterator last)
  7. -> long double
  8. {
  9. static_assert(std::is_integral<
  10. typename std::iterator_traits<RandomAccessIterator>::value_type
  11. >::value, "average only available for built-in integer types");
  12.  
  13. auto size = std::distance(first, last);
  14. if (size == 0) return 0.0L;
  15.  
  16. std::intmax_t accumulator = 0;
  17. long double res = 0.0L;
  18.  
  19. while (first != last) {
  20. std::intmax_t tmp;
  21. if (__builtin_add_overflow(*first, accumulator, &tmp)) {
  22. res += static_cast<long double>(accumulator) / static_cast<long double>(size);
  23. accumulator = *first;
  24. } else {
  25. accumulator = tmp;
  26. }
  27. ++first;
  28. }
  29.  
  30. res += static_cast<long double>(accumulator) / static_cast<long double>(size);
  31. return res;
  32. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement