fork download
  1. #include <iostream>
  2. #include <cassert>
  3. #include <cmath>
  4.  
  5. double from_storage(unsigned short bits) { //only lowest 10 bits used, upper are ignored
  6. double a = bits&0x1FF;
  7. a /= 5.11967985;
  8. a = a*a;//std::pow(a, 2); // inverse of number in to_storage
  9. return double(bits&0x200 ? -a : a);
  10. }
  11.  
  12. unsigned short to_storage(double a) { //only lowest 10 bits set/relevant
  13. assert(a<=10000.0);
  14. assert(a>=-10000.0);
  15. if (a >= 0) {
  16. a = std::pow(a, .5); // inverse of number in from_storage
  17. a *= 5.11967985;
  18. unsigned short b = ((unsigned short)(a));
  19. assert((b&0x200)==0);
  20. return b;
  21. } else {
  22. a = std::pow(-a, .5); // inverse of number in from_storage
  23. a *= 5.11967985;
  24. unsigned short b = ((unsigned short)(a));
  25. assert((b&0x200)==0);
  26. return b | 0x200;
  27. }
  28. }
  29.  
  30. void test(double a) {
  31. unsigned short v = to_storage(a);
  32. double r = from_storage(v);
  33. std::cout << a << '\t' << v << '\t' << r << '\n';
  34. }
  35.  
  36. int main() {
  37. test(-10000.0);
  38. test( -9950.0);
  39. test( -5000.0);
  40. test( -2500.0);
  41. test( -1000.0);
  42. test( -500.0);
  43. test( -250.0);
  44. test( -100.0);
  45. test( -50.0);
  46. test( -25.0);
  47. for(double d = -10.0; d < 11.5; d += 1)
  48. test(d);
  49. test( 25.0);
  50. test( 50.0);
  51. test( 100.0);
  52. test( 250.0);
  53. test( 500.0);
  54. test( 1000.0);
  55. test( 2500.0);
  56. test( 5000.0);
  57. test( 9950.0);
  58. test(10000.0);
  59. return 0;
  60. }
Success #stdin #stdout 0.01s 2724KB
stdin
Standard input is empty
stdout
-10000	1023	-9962.22
-9950	1022	-9923.27
-5000	874	-4999.56
-2500	767	-2480.82
-1000	673	-988.931
-500	626	-495.82
-250	592	-244.171
-100	563	-99.2327
-50	548	-49.4447
-25	537	-23.8448
-10	528	-9.76685
-9	527	-8.58414
-8	526	-7.47774
-7	525	-6.44764
-6	524	-5.49385
-5	523	-4.61636
-4	522	-3.81517
-3	520	-2.44171
-2	519	-1.86944
-1	517	-0.953794
0	0	0
1	5	0.953794
2	7	1.86944
3	8	2.44171
4	10	3.81517
5	11	4.61636
6	12	5.49385
7	13	6.44764
8	14	7.47774
9	15	8.58414
10	16	9.76685
11	16	9.76685
25	25	23.8448
50	36	49.4447
100	51	99.2327
250	80	244.171
500	114	495.82
1000	161	988.931
2500	255	2480.82
5000	362	4999.56
9950	510	9923.27
10000	511	9962.22