1 /*****************************************************************************/ 2 // Copyright 2006 Adobe Systems Incorporated 3 // All Rights Reserved. 4 // 5 // NOTICE: Adobe permits you to use, modify, and distribute this file in 6 // accordance with the terms of the Adobe license agreement accompanying it. 7 /*****************************************************************************/ 8 9 /* $Id: //mondo/dng_sdk_1_4/dng_sdk/source/dng_rational.cpp#1 $ */ 10 /* $DateTime: 2012/05/30 13:28:51 $ */ 11 /* $Change: 832332 $ */ 12 /* $Author: tknoll $ */ 13 14 /*****************************************************************************/ 15 16 #include "dng_rational.h" 17 18 #include "dng_utils.h" 19 20 /*****************************************************************************/ 21 22 real64 dng_srational::As_real64 () const 23 { 24 25 if (d) 26 return (real64) n / (real64) d; 27 28 else 29 return 0.0; 30 31 } 32 33 /*****************************************************************************/ 34 35 void dng_srational::Set_real64 (real64 x, int32 dd) 36 { 37 38 if (x == 0.0) 39 { 40 41 *this = dng_srational (0, 1); 42 43 } 44 45 if (dd == 0) 46 { 47 48 real64 y = Abs_real64 (x); 49 50 if (y >= 32768.0) 51 { 52 dd = 1; 53 } 54 55 else if (y >= 1.0) 56 { 57 dd = 32768; 58 } 59 60 else 61 { 62 dd = 32768 * 32768; 63 } 64 65 } 66 67 *this = dng_srational (Round_int32 (x * dd), dd); 68 69 } 70 71 /*****************************************************************************/ 72 73 void dng_srational::ReduceByFactor (int32 factor) 74 { 75 76 while (n % factor == 0 && 77 d % factor == 0 && 78 d >= factor) 79 { 80 n /= factor; 81 d /= factor; 82 } 83 84 } 85 86 /*****************************************************************************/ 87 88 real64 dng_urational::As_real64 () const 89 { 90 91 if (d) 92 return (real64) n / (real64) d; 93 94 else 95 return 0.0; 96 97 } 98 99 /*****************************************************************************/ 100 101 void dng_urational::Set_real64 (real64 x, uint32 dd) 102 { 103 104 if (x <= 0.0) 105 { 106 107 *this = dng_urational (0, 1); 108 109 } 110 111 if (dd == 0) 112 { 113 114 if (x >= 32768.0) 115 { 116 dd = 1; 117 } 118 119 else if (x >= 1.0) 120 { 121 dd = 32768; 122 } 123 124 else 125 { 126 dd = 32768 * 32768; 127 } 128 129 } 130 131 *this = dng_urational (Round_uint32 (x * dd), dd); 132 133 } 134 135 /*****************************************************************************/ 136 137 void dng_urational::ReduceByFactor (uint32 factor) 138 { 139 140 while (n % factor == 0 && 141 d % factor == 0 && 142 d >= factor) 143 { 144 n /= factor; 145 d /= factor; 146 } 147 148 } 149 150 /*****************************************************************************/ 151