операции с плавающей точкой - PullRequest
1 голос
/ 30 июля 2010

Я прочитал, что какой-то компьютер не может выразить точное число с плавающей точкой, например, 1.1. Давайте возьмем код

float x=0.1;
do{

x+=0.1;
printf("%f\n",x);
} while(x!=1.1); 

этот код никогда не завершается. Как я могу завершить этот код?может быть конвертировать в удвоение или?

Ответы [ 5 ]

3 голосов
/ 30 июля 2010

Для числовых задач обычно указывается эпсилон точности:

bool within_epsilon(float x, float y, float e) {
    if (abs(x - y) > e) {
        return false
    } else {
        return true
    }
}

Выбранный вами эпсилон изменит вашу точность, а эпсилон, который вы сможете выбрать, зависит от вашей реализации с плавающей запятой: Машинный эпсилон .

2 голосов
/ 30 июля 2010

Например, сравнить в допустимых пределах.Т.е.

while (abs(x-1.1)>0.001);

У двойников будет та же проблема, только с большей точностью.Некоторые языки также предлагают рациональные типы, где вы можете указать число в виде дроби 1/10 или типы данных с фиксированной запятой.

0 голосов
/ 30 июля 2010

Работа в фиксированной точке, для такого рода задач.

Например, может помочь тип десятичный . Хотя это не решение всех проблем.

0 голосов
/ 30 июля 2010

Если вы хотите делать код точно так, как вы говорите, то вы хотите использовать тип, подобный десятичному (где это возможно), который является реализацией с плавающей запятой 10, а не 2.

Дальнейшее чтение: http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems и http://en.wikipedia.org/wiki/Decimal_floating_point

0 голосов
/ 30 июля 2010

В этом случае проверка «<» поможет: </p>

float x=0.1;
do{

x+=0.1;
printf("%f\n",x);
} while(x<1.05); 

В общем, вы должны проверить на «эпсилон».Смотрите здесь для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...