/* "Fixed point" means you use ints that are scaled by a value. A common example would be using number of pennies instead of dollars with a float. Fixed-point used to be much faster, but modern processors do well with floats. It also depends on the compiler and the CosmiC compiler is poor with floats. Terry often used 64-bit ints with upper 32-bits as int and lower 32-bits as fraction. See ::/Demo/SubIntAccess.CC for how to access upper or lower 32-bits. For a complete list of nonstandard compiler features, see ::/Doc/CosmiC.DD. */ U0 Main() { F64 t0, f_sum=0, f_val; I64 i , i_sum=0, i_val; i_val = 2.0000002 * 0x100000000; t0 = tS; for (i = 1000000000; i; i--) i_sum += i_val; "Int Sum\t\t:%.9f Time:%7.3fs\n", i_sum / ToF64(0x100000000), tS - t0; f_val = 2.0000002; t0 = tS; for (i = 1000000000; i; i--) f_sum += f_val; "Float Sum\t:%.9f Time:%7.3fs\n", f_sum, tS - t0; '\n'; } U0 DoIt2() { I64 i = 0x123456789ABCDEF0; "i\t\t=%X\n", i; "i&0xFFFFFFFF\t=%X\n", i & 0xFFFFFFFF; "i>>32\t\t=%X\n", i >> 32; /* Standard int types are declared with a special compiler feature which allows a structure to be accessed as a whole. That's why the i variable can be accessed normally in addition to structure member access I64. The actual intrinsic compiler type is U64i. public U64i union I64 { I8i i8[8]; U8i u8[8]; I16 i16[4]; U16 u16[4]; I32 i32[2]; U32 u32[2]; }; It's not quite as great as it seems because the compiler decides it cannot place i into a reg, so there is a penalty. For a complete list of nonstandard compiler features, see ::/Doc/CosmiC.DD. */ "i.u32[0]\t=%X\n", i.u32[0]; "i.u32[1]\t=%X\n", i.u32[1]; } CPURep; Main; DoIt2; //See ::/Demo/Lectures/FixedPointAdvanced.CC /*Program Output 16 Cores 3.500GHz Int Sum :2000000199.768690240 Time: 0.803s Float Sum :2000000225.656127040 Time: 3.615s i =123456789ABCDEF0 i&0xFFFFFFFF =9ABCDEF0 i>>32 =12345678 i.u32[0] =9ABCDEF0 i.u32[1] =12345678 */