Online Compiler C

#include <stdio.h> #include <string.h> #include <inttypes.h> #include <stdint.h> #include <math.h> //Перевод вещетсвенного числа в двоичный вид void print_float_bin(void *num) { unsigned *fi = num; //memcpy(&fi, &num, 4); //копируем память for(int i=31; i>=0; i--) { if(i==30 || i==22) putchar(' '); putchar('0' + (((*fi)>>i)&1) ); } } int main() { float f = 2.0; float f1 = 1.0; for(int i=0; i<10; i++) f1 += 0.1; printf("f = %f f1 = %f\n",f,f1); if( f == f1 ) printf("Yes\n"); else printf("No\n"); print_float_bin(&f); printf("\n"); print_float_bin(&f1); printf("\n"); return 0; }
1) Этот код демонстрирует проблему точности при работе с вещественными числами в C. Он сравнивает два числа (2.0 и 1.0 + 10*0.1), которые математически должны быть равны, но из-за особенностей хранения float в памяти могут отличаться. Также код выводит двоичное представление этих чисел.

2) Подсказки:
- Обрати внимание на то, как накапливается погрешность при многократном сложении 0.1
- Изучи формат хранения float (IEEE 754), чтобы понять вывод функции print_float_bin