Простое сравнение данных с использованием двойной скорости передачи данных - PullRequest
1 голос
/ 25 февраля 2010

Я не могу сделать это сравнение в этой простой ошибке кода .. что я делаю и в чем причина? ...

#include <stdio.h>

int main()
{
    double a = 0.0;
    double b = 1.0;
    double c = 0.1;

    while( a != b )
        a=a+c;

    printf("Suma hasta 1 completada\n");
}

Ответы [ 4 ]

3 голосов
/ 25 февраля 2010

Сделать while ( a <= b )

Операции с двойными (и самими типами данных) имеют проблемы с точностью. Поэтому избегайте использования двойных == двойных или двойных! = Двойных выражений. Переставьте их с помощью <или>. Вероятно, после 10-й итерации c равно 1.00000 .. 001, а не только 1. Это связано главным образом с внутренним представлением двойных типов.

1 голос
/ 25 февраля 2010
1 голос
/ 25 февраля 2010

Читать это (Википедия) . Распечатай и спи с ним под подушкой пару месяцев.

1 голос
/ 25 февраля 2010

Не все десятичные числа могут быть точно представлены с использованием двойного формата с плавающей запятой.

В вашем примере постоянная 0,1 является корнем проблемы. Даже если вы написали 0,1 в исходном коде, следующее лучшее представление в двойном формате - 0,1000000000000000056.

Поэтому сравнение никогда не сравнится с истинным.

Также обратите внимание, что не только константы имеют свои проблемы. Вся арифметика (в вашем случае, кроме того) также имеет ограниченную точность.

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