An@mik@ Ответов: 2

Каков результат следующей программы?


#include <conio.h>
#include <stdio.h>
#define pf printf
void main()
{
   float me = 0.7;
   double  you = 0.7;
   clrscr();
   if (me == you)
   {
	printf("I like this ");
   }
   else
   {
	printf("I don't like this");
   }
   getch();
}


Что я уже пробовал:

вот выход пришел мне это не нравится, но значение переменной me и you одинаковое, так почему же это происходит?
Я изменяю тип данных переменной

int   me = 7;
float   you = 7;
clrscr();
if (me == you)
{
 printf("I like this ");
}
else
{
 printf("I don't like this");
}


здесь условие if истинно, а выход-мне это нравится.
не могли бы вы объяснить мне, почему?

2 Ответов

Рейтинг:
14

Patrice T

Цитата:
вот выход пришел мне это не нравится, но значение переменной me и you одинаковое, так почему же это происходит?

Значения не совпадают из-за разницы типов данных.
Double и float являются плавающей точкой, поэтому 0.7 аппроксимируются в обоих типах, но с небольшой разницей, которая остается, когда float расходуется на удвоение, достаточно, чтобы сделать тест неудачным.

Во втором коде, когда тест выполнен, int расходуется на float и дает точно такое же значение.


An@mik@

Как мы можем проверить приблизительное значение ? Я отлаживаю в Редакторе c, но он показывает только присвоенное значение.

Patrice T

Поскольку преобразование выполняется на лету в тесте, вам нужно выполнить отладку на уровне сборки, чтобы увидеть что-то, и Вам также может потребоваться отобразить значение в двоичном виде, чтобы увидеть его внутреннее значение.

Рейтинг:
11

KarstenK

Из-за разных типов данных значения очень немного отличаются. Вы должны рассчитать разницу и проверить, что ее значение очень крошечное.

double diff = me - you;
if( abs( diff ) < 0.00001 )
Воспользуйся брюшной пресс для сравнения. Значение 0.00001 я выбрал по опыту.


An@mik@

Хорошо спасибо