Округление чисел в МТ4 через NormalizeDouble - страница 17

 
pavlick_:

Я написал небольшой обучающий код (самому было интересно поковырять), который выворачивает наружу внутренности плавающего числа.

Выхлоп при f == 0.5 + 1/(2^24). 1/(2^24) - самый младший разряд мантиссы при данной степени: 

А что именно вы хотели там увидеть? У чисел float один бит на знак, 8 на экспоненту, остальные 23 - мантисса, т.е. максимальная точность - 23 знака после запятой в двоичном представлении или 7 знаков в десятичном.  У чисел double - 1 бит на знак, 11 на экспоненту, остальные 52 - мантисса, максимальная точность - 52 знака после запятой в двоичном представлении или 16 знаков в десятичном. Зачем для этого код?

 
Sergei Vladimirov:

А что именно вы хотели там увидеть? У чисел float один бит на знак, 8 на экспоненту, остальные 23 - мантисса, т.е. максимальная точность - 23 знака после запятой в двоичном представлении или 7 знаков в десятичном.  У чисел double - 1 бит на знак, 11 на экспоненту, остальные 52 - мантисса, максимальная точность - 52 знака после запятой в двоичном представлении или 16 знаков в десятичном. Зачем для этого код?

"Теория без практики мертва и бесплодна, практика без теории бесполезна и пагубна". А всяких интересных вещей с плавающими числами хватает:
float a, b, f;
a=123456789;
b=123456788;    
f=a-b;
cout << f;
// cout: 8
 
pavlick_:
"Теория без практики мертва и бесплодна, практика без теории бесполезна и пагубна". А всяких интересных вещей с плавающими числами хватает:

Я просто подумал, что может вы в МКЛ что-то уникальное увидеть ожидали.

А все эти фокусы с переполнением мантиссы - да, интересны. Для первого класса. )

void OnStart()
{
        float f1 = (float)1.1;
        float f2 = (float)2.2;
        float f3 = (float)3.3;
        
        if((f1 * f2) * f3 == f1 * (f2 * f3))
                Print("Выражения равны.");
        else
                Print("Нифига не равны!");
}
 
Для первого класса. )
 Конечно, рассказывайте, большинстов программистов в вопросе плавает, у меня и самого пробелы имеются.
 
pavlick_:
 Конечно, рассказывайте, большинстов программистов в вопросе плавает, у меня и самого пробелы имеются.
Ну, не знаю, нас двоичной арифметикой натаскивали так, что на всю жизнь в голове засело. ) Другое дело, что здесь далеко не все - программисты. В общем, вы не подумайте, что мой вопрос - какой-то камень в ваш огород, просто я подумал, что цель вашей программки - увидеть какие-то отличия в МКЛ от стандарта, вот и спросил.
 
int main(){
  // МКЛ аналог numeric_limits<float>::epsilon() - FLT_EPSILON
  float a = (float)10 + numeric_limits<float>::epsilon();
  float b = (float)1 + numeric_limits<float>::epsilon();
  float c = (float)0.5 + numeric_limits<float>::epsilon();
  print_float(a);
  print_float(b);
  print_float(c);
}

----a--------------
value = 10
mantissa 24:
1,01000000000000000000000
exponenta - 127 = 3

мантиса без прибавки эпсилон:
1,01000000000000000000000
----b--------------
value = 1.0000001192092896
mantissa 24:
1,00000000000000000000001
exponenta - 127 = 0

мантиса без прибавки эпсилон:
1,00000000000000000000000
----c--------------
value = 0.50000011920928955
mantissa 24:
1,00000000000000000000010
exponenta - 127 = -1

мантиса без прибавки эпсилон:
1,00000000000000000000000