fork download
  1. #include <vector>
  2. #include <algorithm>
  3. #include <memory>
  4. #include <iostream>
  5.  
  6. template<typename T>
  7. T interpolate(uint16_t factor, const T& from, const T& to)
  8. {
  9. return T(double(from) + double(factor) * (double(to) - double(from)) / double(0xFFFF));
  10. }
  11.  
  12. template<typename T>
  13. void test(const T& from, const T& to)
  14. {
  15. for(uint16_t t = 0; t < 0xFFFF; t += 0xFFFF / 5)
  16. {
  17. const T& r = interpolate(t, from, to);
  18. std::cout << "interpolate(" << t << ", " << from << ", " << to << ") = " << r << "\n";
  19. }
  20.  
  21. {
  22. const uint16_t t = 0xFFFF;
  23. const T& r = interpolate(t, from, to);
  24. std::cout << "interpolate(" << t << ", " << from << ", " << to << ") = " << r << "\n";
  25. }
  26. }
  27.  
  28. template<typename T>
  29. void test_lims()
  30. {
  31. const T lowest = std::numeric_limits<T>::lowest();
  32. const T max = std::numeric_limits<T>::max();
  33. test(lowest, max);
  34. test(max, lowest);
  35. }
  36.  
  37. int main()
  38. {
  39. test(0, 10);
  40. test(-25, 33);
  41. test(1, 2);
  42. test(1, 1);
  43. test(1, 0);
  44. test(1, -1);
  45. test(-1, 1);
  46. test(-1, -1);
  47.  
  48. test<int8_t>('0', '9');
  49. test<int8_t>('A', 'Z');
  50. test<uint8_t>('0', '9');
  51. test<uint8_t>('A', 'Z');
  52.  
  53. test_lims<int16_t>();
  54. test_lims<uint16_t>();
  55. test_lims<int32_t>();
  56. test_lims<uint32_t>();
  57. }
  58.  
Success #stdin #stdout 0s 3416KB
stdin
Standard input is empty
stdout
interpolate(0, 0, 10) = 0
interpolate(13107, 0, 10) = 2
interpolate(26214, 0, 10) = 4
interpolate(39321, 0, 10) = 6
interpolate(52428, 0, 10) = 8
interpolate(65535, 0, 10) = 10
interpolate(0, -25, 33) = -25
interpolate(13107, -25, 33) = -13
interpolate(26214, -25, 33) = -1
interpolate(39321, -25, 33) = 9
interpolate(52428, -25, 33) = 21
interpolate(65535, -25, 33) = 33
interpolate(0, 1, 2) = 1
interpolate(13107, 1, 2) = 1
interpolate(26214, 1, 2) = 1
interpolate(39321, 1, 2) = 1
interpolate(52428, 1, 2) = 1
interpolate(65535, 1, 2) = 2
interpolate(0, 1, 1) = 1
interpolate(13107, 1, 1) = 1
interpolate(26214, 1, 1) = 1
interpolate(39321, 1, 1) = 1
interpolate(52428, 1, 1) = 1
interpolate(65535, 1, 1) = 1
interpolate(0, 1, 0) = 1
interpolate(13107, 1, 0) = 0
interpolate(26214, 1, 0) = 0
interpolate(39321, 1, 0) = 0
interpolate(52428, 1, 0) = 0
interpolate(65535, 1, 0) = 0
interpolate(0, 1, -1) = 1
interpolate(13107, 1, -1) = 0
interpolate(26214, 1, -1) = 0
interpolate(39321, 1, -1) = 0
interpolate(52428, 1, -1) = 0
interpolate(65535, 1, -1) = -1
interpolate(0, -1, 1) = -1
interpolate(13107, -1, 1) = 0
interpolate(26214, -1, 1) = 0
interpolate(39321, -1, 1) = 0
interpolate(52428, -1, 1) = 0
interpolate(65535, -1, 1) = 1
interpolate(0, -1, -1) = -1
interpolate(13107, -1, -1) = -1
interpolate(26214, -1, -1) = -1
interpolate(39321, -1, -1) = -1
interpolate(52428, -1, -1) = -1
interpolate(65535, -1, -1) = -1
interpolate(0, 0, 9) = 0
interpolate(13107, 0, 9) = 1
interpolate(26214, 0, 9) = 3
interpolate(39321, 0, 9) = 5
interpolate(52428, 0, 9) = 7
interpolate(65535, 0, 9) = 9
interpolate(0, A, Z) = A
interpolate(13107, A, Z) = F
interpolate(26214, A, Z) = K
interpolate(39321, A, Z) = P
interpolate(52428, A, Z) = U
interpolate(65535, A, Z) = Z
interpolate(0, 0, 9) = 0
interpolate(13107, 0, 9) = 1
interpolate(26214, 0, 9) = 3
interpolate(39321, 0, 9) = 5
interpolate(52428, 0, 9) = 7
interpolate(65535, 0, 9) = 9
interpolate(0, A, Z) = A
interpolate(13107, A, Z) = F
interpolate(26214, A, Z) = K
interpolate(39321, A, Z) = P
interpolate(52428, A, Z) = U
interpolate(65535, A, Z) = Z
interpolate(0, -32768, 32767) = -32768
interpolate(13107, -32768, 32767) = -19661
interpolate(26214, -32768, 32767) = -6554
interpolate(39321, -32768, 32767) = 6553
interpolate(52428, -32768, 32767) = 19660
interpolate(65535, -32768, 32767) = 32767
interpolate(0, 32767, -32768) = 32767
interpolate(13107, 32767, -32768) = 19660
interpolate(26214, 32767, -32768) = 6553
interpolate(39321, 32767, -32768) = -6554
interpolate(52428, 32767, -32768) = -19661
interpolate(65535, 32767, -32768) = -32768
interpolate(0, 0, 65535) = 0
interpolate(13107, 0, 65535) = 13107
interpolate(26214, 0, 65535) = 26214
interpolate(39321, 0, 65535) = 39321
interpolate(52428, 0, 65535) = 52428
interpolate(65535, 0, 65535) = 65535
interpolate(0, 65535, 0) = 65535
interpolate(13107, 65535, 0) = 52428
interpolate(26214, 65535, 0) = 39321
interpolate(39321, 65535, 0) = 26214
interpolate(52428, 65535, 0) = 13107
interpolate(65535, 65535, 0) = 0
interpolate(0, -2147483648, 2147483647) = -2147483648
interpolate(13107, -2147483648, 2147483647) = -1288490189
interpolate(26214, -2147483648, 2147483647) = -429496730
interpolate(39321, -2147483648, 2147483647) = 429496729
interpolate(52428, -2147483648, 2147483647) = 1288490188
interpolate(65535, -2147483648, 2147483647) = 2147483647
interpolate(0, 2147483647, -2147483648) = 2147483647
interpolate(13107, 2147483647, -2147483648) = 1288490188
interpolate(26214, 2147483647, -2147483648) = 429496729
interpolate(39321, 2147483647, -2147483648) = -429496730
interpolate(52428, 2147483647, -2147483648) = -1288490189
interpolate(65535, 2147483647, -2147483648) = -2147483648
interpolate(0, 0, 4294967295) = 0
interpolate(13107, 0, 4294967295) = 858993459
interpolate(26214, 0, 4294967295) = 1717986918
interpolate(39321, 0, 4294967295) = 2576980377
interpolate(52428, 0, 4294967295) = 3435973836
interpolate(65535, 0, 4294967295) = 4294967295
interpolate(0, 4294967295, 0) = 4294967295
interpolate(13107, 4294967295, 0) = 3435973836
interpolate(26214, 4294967295, 0) = 2576980377
interpolate(39321, 4294967295, 0) = 1717986918
interpolate(52428, 4294967295, 0) = 858993459
interpolate(65535, 4294967295, 0) = 0