|
@ -60,14 +60,14 @@ unsigned int sign_float(unsigned int number) { |
|
|
// reading precision out of an integer (floating number) |
|
|
// reading precision out of an integer (floating number) |
|
|
|
|
|
|
|
|
unsigned int precision_float(unsigned int number) { |
|
|
unsigned int precision_float(unsigned int number) { |
|
|
unsigned int precision = 8388607; |
|
|
|
|
|
|
|
|
unsigned int precision = 0x007fffff; |
|
|
return (number & precision); |
|
|
return (number & precision); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// reading exponent out of an integer (floating number) |
|
|
// reading exponent out of an integer (floating number) |
|
|
|
|
|
|
|
|
unsigned int exponent_float(unsigned int number) { |
|
|
unsigned int exponent_float(unsigned int number) { |
|
|
unsigned int exponent = 2139095040; |
|
|
|
|
|
|
|
|
unsigned int exponent = 0x7f800000; |
|
|
return (number & exponent) >> 23; |
|
|
return (number & exponent) >> 23; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
@ -90,7 +90,7 @@ float addition_float(float number1, float number2) { |
|
|
else if (number1 == (float) 0.0) return number2; |
|
|
else if (number1 == (float) 0.0) return number2; |
|
|
else if (number2 > number1) return addition_float(number2, number1); |
|
|
else if (number2 > number1) return addition_float(number2, number1); |
|
|
|
|
|
|
|
|
unsigned int e = 8388608; |
|
|
|
|
|
|
|
|
unsigned int e = 0x00800000; |
|
|
struct data num1, num2, num3; |
|
|
struct data num1, num2, num3; |
|
|
num1.number.floating = number1, num2.number.floating = number2; |
|
|
num1.number.floating = number1, num2.number.floating = number2; |
|
|
num1.sign = sign_float(num1.number.integer), num2.sign = sign_float(num2.number.integer); |
|
|
num1.sign = sign_float(num1.number.integer), num2.sign = sign_float(num2.number.integer); |
|
@ -98,7 +98,7 @@ float addition_float(float number1, float number2) { |
|
|
num1.precision = precision_float(num1.number.integer) | e, num2.precision = precision_float(num2.number.integer) | e; |
|
|
num1.precision = precision_float(num1.number.integer) | e, num2.precision = precision_float(num2.number.integer) | e; |
|
|
|
|
|
|
|
|
num3.precision = addition_precision_float(num1.precision, num2.precision >> (num1.exponent - num2.exponent)); |
|
|
num3.precision = addition_precision_float(num1.precision, num2.precision >> (num1.exponent - num2.exponent)); |
|
|
if (num3.precision > 16777215) { |
|
|
|
|
|
|
|
|
if (num3.precision > 0x00ffffff) { |
|
|
num3.exponent = addition_uint(num1.exponent, 1); |
|
|
num3.exponent = addition_uint(num1.exponent, 1); |
|
|
num3.precision = (num3.precision >> 1); |
|
|
num3.precision = (num3.precision >> 1); |
|
|
} |
|
|
} |
|
@ -112,11 +112,10 @@ float addition_float(float number1, float number2) { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
unsigned long long sign_double(unsigned long long a) { |
|
|
unsigned long long sign_double(unsigned long long a) { |
|
|
if (a & 0x8000000000000000 == 0x8000000000000000) return 1; |
|
|
|
|
|
|
|
|
if (a & 0x8000000000000000) return 1; |
|
|
else return 0; |
|
|
else return 0; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
unsigned long long precision_double(unsigned long long a) { |
|
|
unsigned long long precision_double(unsigned long long a) { |
|
|
a &= 0x000fffffffffffff; |
|
|
|
|
|
return a; |
|
|
|
|
|
|
|
|
return a & 0x000fffffffffffff; |
|
|
} |
|
|
} |