2014-11-04 3 views
0

В последнее время я сталкиваюсь с проблемой при сравнении double в выражении if. Я пытался вырезать количество целых чисел в два раза. Будучи новичком, я не уверен, что случилось с моим кодом.Сравнение двойной ошибки C++

Это мой код:

#include <iostream> 

using namespace std; 

int main(){ 
int x=0;//convert double to int 
long double Out;//Result 
long double In=10;//Input double 

//Loop Begin 
while(In>0){ 
x=In;//convert double to int 
Out= (x/In);//Out(test if whole number, will return 1) 

//test for 1 
//////////////// 
if(Out == 1){ 
    cout<<"[Whole Number] "; 
} 
//////////////// 
//test end 

cout<<"In :"<<In<<", "; 
cout<<"X :"<<x<<", "; 
cout<<"Out :"<<Out<<endl; 
In-=0.1;//decrease to finish loop (eventually) 
} 
//Loop End 

cin.get(); 
return 0; 
} 

Эта программа будет проверять и выводить целые числа в двойном (In). Я понял, что точность двойника влияет на оператор if, поэтому я не могу получить результат «[Целый номер]». Хотя я узнал, что если бы я использовал (0.9999) в «if (Out> = 0.9999)», сравнение будет работать. Но я не уверен в решении, пожалуйста, помогите! Очень признателен!

+1

Возможный дубликат [Как мне сделать сравнение с плавающей запятой?] (Http://stackoverflow.com/questions/4915462/how-should-i-do-floating-point-comparison) – Slava

ответ

-2

Попробуйте использовать оператор модуля: http://www.cprogramming.com/tutorial/modulus.html

Что-то вроде если (в% 1 == 0) должно работать.

+1

% не определен для плавающих точечные типы. – Borgleader

+0

Мой плохой, не слишком знакомый с C++ – Toby

0

Ваш цикл while никогда не останавливается, его бесконечный цикл. Вы ничего не делаете со значением «In» в цикле while, поэтому оно всегда будет больше 0, поэтому бесконечный цикл.

0

Вы, вероятно, следует подходить к проблеме более непосредственно modf:

double int_part, frac_part; 

frac_part = std::modf(in, &int_part); 

if (frac_part == 0) { 
    // int_part contains integer value. 
} else { 
    // process the double non-integer floating point value. 
} 
0

Ваш код работает прекрасно. Если вы вычтите 0.1 из 10.0, то вероятность того, что результат будет не целым числом из-за ошибок округления, и ваш код скажет вам именно это. Код не ошибается, ваши ожидания ошибочны.

if (Out >= 0.9999) 

, очевидно, не является решением, поскольку оно всегда будет истинным, если In> = 10000.0.

0

Сделайте так, чтобы числа с плавающей запятой были преобразованы в двоичное представление на компьютере, они по своей сути неточны и, таким образом, делают логические сравнения несколько сложными (http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems). При выполнении таких сравнений с числами с плавающей запятой обычно вы будете использовать константу epsilon (http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm), которая представляет максимально допустимую ошибку при сравнении. В вашем случае вам нужно выбрать подходящее значение для epsilon (скажем, .000001). Затем измените сравнение с:

if(abs(out - 1) < epsilon){ //Take the difference between out and 1 
    cout<<"[Whole Number]"; //If it is "close enough" print to console 

}

Я больше парень Java, но я полагаю, вам нужно #include stdlib.h, чтобы использовать функцию ABS().

Надеюсь, что это поможет!

Смежные вопросы