Почему в следующем коде нет == 0? - PullRequest
2 голосов
/ 28 апреля 2011
#include <stdio.h>
int main( )
{
    float a=1.0;
    long i;

    for(i=0; i<100; i++)
    {
        a = a - 0.01;
    }
    printf("%e\n",a);
}

Результат: 6,59e-07

Ответы [ 5 ]

11 голосов
/ 28 апреля 2011

Это двоичное число с плавающей запятой, а не десятичное - поэтому вам следует ожидать ошибок округления.См. Раздел Basic в этой статье:

Что должен знать каждый программист об арифметике с плавающей точкой

Например, значение 0.01 не имеет точного представления в двоичном типе с плавающей запятой.Чтобы получить «правильный» результат в вашем образце, вам нужно либо округлить, либо использовать десятичный тип с плавающей запятой (см. Wikipedia ):

Двоичные типы с фиксированной запятой наиболееобычно используется, потому что операции масштабирования могут быть реализованы как быстрые сдвиги битов.Двоичные числа с фиксированной запятой могут точно представлять дробные степени двух, но, подобно двоичным числам с плавающей запятой, не могут точно представлять дробные степени десяти.Если желательны точные дробные степени десяти, то следует использовать десятичный формат.Например, одна десятая (0,1) и одна сотая (0,01) могут быть представлены только приблизительно двоичными представлениями с фиксированной или двоичной плавающей точкой, тогда как они могут быть представлены точно в десятичном представлении с фиксированной точкой или десятичным представлением с плавающей точкой,Эти представления могут быть закодированы разными способами, включая BCD.

3 голосов
/ 28 апреля 2011

Здесь есть два вопроса.Если вы спрашиваете, почему мой оператор printf отображает результат как 6.59e-07 вместо 0.000000659, это потому, что вы использовали спецификатор формата для научной нотации: %e.Вы хотите %f для плавающей запятой a.

printf("%f\n",a);

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

1 голос
/ 28 апреля 2011

Вы должны указать% f для печати числа с плавающей запятой, тогда он напечатает 0 для переменной a.

0 голосов
/ 28 апреля 2011

Точность с плавающими числами не точна, поэтому вы найдете этот результат.

Сердечно

0 голосов
/ 28 апреля 2011

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

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