функция — аппроксимация двойных переменных в переполнении стека

Я пытаюсь запустить эту программу, в которой вы вставляете два двойных значения и получаете взамен, какое из двух чисел больше, сообщение «числа равны», если значения двух двойных одинаковы, и сообщение «числа почти равны», если разница между двумя числами меньше 1 / 10.000.000.

Код, который я написал, таков:

    #include "stdafx.h"#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
inline void keep_window_open() { char ch; cin >> ch; }

double square(double x)
{
return x * x;
}

int main() {
double number;
double number2;
while (cin >> number, cin >> number2) {
if (number == '|' || number2 == '|') break;
else {
cout << number << " " << number2 << endl;
if (number > number2) cout << number << " is bigger than " << number2 << endl;
if (number < number2) cout << number2 << " is bigger than " << number << endl;
double difference = number - number2;
if (difference > - 1/10000000 && difference < 0) cout << "the numbers are almost equal" << endl;
if (difference < 1 / 10000000 && difference > 0) cout << "the numbers are almost equal" << endl;
if (number == number2) cout << "the numbers are equal" << endl;
}

}
}

Когда я запускаю эту программу и вставляю два числа, разница которых меньше 1 / 10.000.000, программа должна вернуть «числа почти равны», но это не так.

Вот что он возвращает (когда я запускаю программу и вставляю два числа), если я вставляю «1» и «1.0000000000001»:

    "1 1.0000000000001

1 1

1 is bigger than 1"

Я не понимаю, почему программа считает два числа, которые я вставил, равными 1, и возвращает «1» и «1» в качестве значений.

Это также должно дать взамен «числа почти равны», так как я написал:

     if (difference > - 1/10000000 && difference < 0) cout << "the numbers are almost equal" << endl;
if (difference < 1 / 10000000 && difference > 0) cout << "the numbers are almost equal" << endl;

Но это не так.

Как заставить программу возвращать «числа почти равны», когда я вставляю два двойных значения, которые отличаются менее чем на 1 / 10.000.000 (например, «1» и «1.0000000000001»)?

0

Решение

cout округляет такие двойные значения, когда вы пытаетесь их распечатать. Увидеть Вот

Что касается вашего кода, целочисленное деление (1/10000000) всегда будет возвращать целое число, поэтому вам нужно выполнить деление двойных или десятичных значений (1.0 / 10000000.0).

Вот рабочий код с некоторыми незначительными изменениями в логике

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
inline void keep_window_open() { char ch; cin >> ch; }

double square(double x)
{
return x * x;
}

int main() {
double number;
double number2;
while (cin >> number, cin >> number2) {
if (number == '|' || number2 == '|') break;
else {
cout.precision(15);
cout << number << " " << number2 << endl;
double difference = number - number2;
if (difference > - 1/10000000.0 && difference < 0) cout << "the numbers are almost equal" << endl;
else if (difference < 1/10000000.0 && difference > 0) cout << "the numbers are almost equal" << endl;
else if (number == number2) cout << "the numbers are equal" << endl;
else if (number > number2) cout << number << " is bigger than " << number2 << endl;
else if (number < number2) cout << number2 << " is bigger than " << number << endl;
}

}
}
1

Другие решения

Других решений пока нет …