LINUX.ORG.RU

Баг в gcc?


0

2

Код

#include <iostream>

int main(int argc, char** argv)
{
        for (double i = -1; i <= 1; i += 0.1)
                std::cout << i << std::endl;

        return 0;
}

Дает такой вывод

%g++ -o test test.cpp
%./test
-1
-0.9
-0.8
-0.7
-0.6
-0.5
-0.4
-0.3
-0.2
-0.1
-1.38778e-16
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1
Что происходит с нулем?

gcc (Ubuntu 4.4.3-4ubuntu5) 4.4.3


Нуля не существует.

anonymous
()

gcc тут непричем, подобный вывод выдают и Intel C++ и Clang++

Sylvia ★★★★★
()

1 != 0.1*10, потому как 0.1 в double это не совсем 0.1

Учите матчасть.

vkos ★★
()

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

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

есть бесконечно малая величина

fixed

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

>В компьютерном представлении чисел с плавающей точкой нуля просто нет, есть бесконечно малая величина.

Конечно малая величина.

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

>В компьютерном представлении чисел с плавающей точкой нуля просто нет

Да неужели? И давно это у нас мантисса не может быть нулевой?

А может быть дело в том, что 0.1 является периодической дробью в системе счисления с основанием 2 и при последовательном сложении подобных величин накапливается ошибка?

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

Да неужели? И давно это у нас мантисса не может быть нулевой?

А давно у нас ноль может быть положительный и отрицательный?

А может быть дело в том, что 0.1 является периодической дробью в системе счисления с основанием 2 и при последовательном сложении подобных величин накапливается ошибка?

Об этом я сказал во втором предложении своего поста.

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

ЕМНИП. +0 и -0 там есть, но в таком виде: 1/+0 = inf 1/-0 = -inf

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

Да неужели? И давно это у нас мантисса не может быть нулевой?

Да кстати, вот тут я хрень какую-то сказал. Надо с ЛОРом завязывать...

Deleted
()

Всем спасибо за пояснения. Буду учить матчасть.

TnT
() автор топика
/*doubleC.c*/
#include <stdio.h>

int main()
{
	double i;
	for (i=-1; i<=1; i+=0.1) printf("%.2f\n",i);
	return 0;
}
/*doubleCpp.cpp*/
#include <iostream>

int main()
{
	for (double i=-1.0; i<=1.0; i+=0.1) std::cout << i << std::endl;
	return 0;
}
$ gcc doubleC.c -o doubleC
$ g++ doubleCpp.cpp -o doubleCpp
$ ./doubleC
-1.00
-0.90
-0.80
-0.70
-0.60
-0.50
-0.40
-0.30
-0.20
-0.10
-0.00
0.10
0.20
0.30
0.40
0.50
0.60
0.70
0.80
0.90
1.00
$ ./doubleCpp 
-1
-0.9
-0.8
-0.7
-0.6
-0.5
-0.4
-0.3
-0.2
-0.1
-1.38778e-16
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1

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

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