LINUX.ORG.RU

[float] откуда берётся неточность?

 


0

0

Прога на фортране:

      PROGRAM test1f
      X = 0
      STEP = 0.10
      DO 7, I = 1, 10
      WRITE (*,*) X
      X = X + 0.10
7     CONTINUE
      END
То же, но на C:
#include <stdlib.h>
#include <stdio.h>

int main()
{
	int I;
	float
		X=0,
		STEP=0.1;
	for (I=1; I<=10; I++)
	{
		printf("%12.8f\n",X);
		X += STEP;
	}
	return EXIT_SUCCESS;
}

Вывод:

  0.00000000
  0.10000000
  0.20000000
  0.30000001
  0.40000001
  0.50000000
  0.60000002
  0.70000005
  0.80000007
  0.90000010

Вопрос - откуда берётся ошибка? Как сделать чтобы ошибки не было?

Учить азы информатики про представление чисел в компьютерах.

wfrr ★★☆
()

Вся Вселенная одна большая ошибка.

Вот и думай или автор прогулял информатику, или это тролль.

anonymous
()

>Как сделать чтобы ошибки не было?

Use Haskell, Luke!

mapM_ (print . fromRational) $ take 10 $ iterate (+1%10) 0

0.0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9

imp ★★
()

> Вопрос - откуда берётся ошибка?

Ошибки нет. Числа 0.1 тоже нет.

Сравни форматы %12.30f, %12.6f и %12f.

Наверное, ты и так всё это знаешь?

А вообще, если нужна точность float, то вычисления стоит делать в double.

alexsaa
()

контрольный вопрос -- при каких N число 1/N записывается бесконечной двоичной дробью?

dilmah ★★★★★
()

Штудируй второй том Кнута (как я сейчас)

Absurd ★★★
()

>Как сделать чтобы ошибки не было?

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

Absurd ★★★
()
Ответ на: комментарий от LinuxUser

>Думаю над решением.

Округляй.

anonymous
()
Ответ на: комментарий от LinuxUser

> Думаю над решением.

Решением чего, интересно? Проблема как-то так и не сформулировалась...

Чтобы вообще без ошибки, оно только рациональные числа проканают. Если устроит, сюда посмотри: http://gmplib.org/manual/Rational-Number-Functions.html#Rational-Number-Funct...

Или просто многократная точность? Тогда вот, рекомендую: http://gmplib.org/manual/Floating_002dpoint-Functions.html#Floating_002dpoint...

(а вообще, такого добра навалом, просто gmp самая шустрая)

Die-Hard ★★★★★
()

> Как сделать чтобы ошибки не было?

пользоватся двоичными дробями: вместо 1/10 сделать шаг 1/16.

anonymous
()

Книжка есть такая, название вроде "What everyone computer scientist should know about float operation".

Yoda_The_Master
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.