Форум программистов, компьютерный форум CyberForum.ru

Разница результатов float и double - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 5.00
Gambit_88
3 / 3 / 0
Регистрация: 25.03.2011
Сообщений: 173
19.02.2014, 19:58     Разница результатов float и double #1
Объясните, пожалуйста, почему результаты для float и double отличаются?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int main()
{
    float a = 1000, b = 0.0001,
        c = pow(a - b, 2),
        d = pow(a, 2) - 2 * a * b,
        e = pow(b, 2);
    double a2 = 1000, b2 = 0.0001,
        c2 = pow(a2 - b2, 2),
        d2 = pow(a2, 2) - 2 * a2 * b2,
        e2 = pow(b2, 2);
    cout << "Float: " << (c - d) / e << endl;
    cout << "Double: " << (c2 - d2) / e2 << endl;
    _getch();
    return 0;
}
Float: -6.25e+006
Double: 1.00117
Второстепенно:
Как вывести результат без экспоненты?
Что значит предупреждение компилятора при инициализации float b warning C4305: инициализация: усечение из "double" к "float"?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.02.2014, 19:58     Разница результатов float и double
Посмотрите здесь:

C++ типы данных float и double
C++ double указатель и float матрица
C++ как победить Double? Float?
float double int C++
C++ float и double (расчет точности)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Amandosov
Знаток
156 / 156 / 65
Регистрация: 18.11.2012
Сообщений: 411
Записей в блоге: 2
19.02.2014, 21:21     Разница результатов float и double #2
дааа
я вот попробовал так:

Здесь походу дело в точности))

Добавлено через 3 минуты
с printf()
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include<iostream>
#include <math.h>
#include <stdio.h>
 
using namespace std;
int main()
{
    float a = 1000, b = 0.0001,
    c = pow(a - b, 2.0),//999999.80000001
        d = pow(a, 2.0) - 2.0 * a * b,//999999.9
        e = pow(b, 2.0);//0.00000001
    double a2 = 1000, b2 = 0.0001,
        c2 = pow(a2 - b2, 2.0),
        d2 = pow(a2, 2.0) - 2.0 * a2 * b2,
        e2 = pow(b2, 2.0);
    cout << "Float: " << (c - d) / double(e) << endl;//-0.09999999
    cout << "Double: " << (c2 - d2) / e2 << endl;
    printf("%0.15f %0.15f %0.15f %0.15f", c,d,e,c-d);
    cout<<endl;
    printf("%0.15f %0.15f %0.15f %0.15f", c2,d2,e2,c2-d2);
    cout<<endl;
    
   
    return 0;
}
результат
C++
1
2
3
4
Float: -6.25e+06
Double: 1.00117
999999.750000000000000 999999.812500000000000 0.000000009999999 -0.062500000000000
999999.800000010058284 999999.800000000046566 0.000000010000000 0.000000010011718
Добавлено через 56 секунд
Походу double точнее
ValeryS
Модератор
6375 / 4841 / 443
Регистрация: 14.02.2011
Сообщений: 16,044
19.02.2014, 21:30     Разница результатов float и double #3
Цитата Сообщение от Gambit_88 Посмотреть сообщение
Разница результатов float и double
а почему
C++
1
2
3
4
 char a =127;
 int  b=127;
a++;
b++;
получится a=-128
и b= 128
не возникает вопросов?
размерность чисел посмотри

Добавлено через 3 минуты
float 4байта 32 бита от 3.4E-38 до 3.4E+38
double 8 байт 64 бита от 1.7E-308 до1.7E+308
есть разница?
http://citforum.ru/programming/cpp_march/cpp_017.shtml
Gambit_88
3 / 3 / 0
Регистрация: 25.03.2011
Сообщений: 173
19.02.2014, 21:35  [ТС]     Разница результатов float и double #4
ValeryS, смотрел я на диапазон значений. Только в экспоненциальной форме не понял, влазят в него мои числа или нет...
ValeryS
Модератор
6375 / 4841 / 443
Регистрация: 14.02.2011
Сообщений: 16,044
19.02.2014, 21:49     Разница результатов float и double #5
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Gambit_88 Посмотреть сообщение
смотрел я на диапазон значений.
кроме диапазона есть разрядность числа
смотри на пальцах показываю
32 бита
один бит отдай под знак не греши остается 31
теперь степень числи -38 +38 сколько под неё отдать ?
отдают 8 байт остается 31-8 = 23 примерно в десятичной 8 миллионов 6 знаков
байта
теперь учти что в плавающих целых чисел нет все дробные меньше 1, причем дробь не десятичная а двоичная
значит происходит округление
и в результате
1000-0.0001= никак не будет 9999.9999 знаков не хватит плюс округление
вот тебе и потеря точности
все это лучше меня Evg расписал
http://www.cyberforum.ru/blogs/18334/blog88.html
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16825 / 5246 / 321
Регистрация: 30.03.2009
Сообщений: 14,126
Записей в блоге: 26
19.02.2014, 22:07     Разница результатов float и double #6
Цитата Сообщение от Gambit_88 Посмотреть сообщение
Что значит предупреждение компилятора при инициализации float b warning C4305: инициализация: усечение из "double" к "float"?
Константа 0.0001 имеет тип double, а переменная b, в которую ты записываешь константу - float. Об этом предупреждает компилятор
Yandex
Объявления
19.02.2014, 22:07     Разница результатов float и double
Ответ Создать тему
Опции темы

Текущее время: 23:21. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru