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

Почему точность Double такая же как у Float ? - C++

Восстановить пароль Регистрация
 
Pro_ha
1 / 1 / 0
Регистрация: 07.06.2013
Сообщений: 32
07.06.2013, 09:05     Почему точность Double такая же как у Float ? #1
Вначале столкнулся с проблемой float:
time=65536.0f; (можно и больше число указать)
time+=0.003; Тут time не меняетя! Оно меняется, только если не меньше 0.004 прибавлять.
Понятно. Проблема с точностью. Но тип double, ведет себя точно также. И даже long double.

Не пойму в чем проблема. Может в компиляторе что то не так настроено? (VC++2010)

Добавлено через 35 минут
Создал чистый проект, в нем double работает как положено. Даже подключил все либы в той же последовательности. Работает. Значит где то в настройках проекта опция стоит. Но какая?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.06.2013, 09:05     Почему точность Double такая же как у Float ?
Посмотрите здесь:

Как именно округляются float и double? C++
C++ как победить Double? Float?
Почему при преобразования из float в double коверкается число? C++
C++ Точность float
Как преобразовать все int,float,double в строки LPWSTR, LPCTSTR C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dstat
36 / 38 / 1
Регистрация: 01.06.2011
Сообщений: 238
07.06.2013, 09:24     Почему точность Double такая же как у Float ? #2
c++->code generation-> floating point model
есть три модели fast, precise, strict
Но я попробовал, и ни в одной модели не наблюдал такого поведения. Вы точно уверены, что не меняется (у меня 65536,0f+0.003 не поменялось только если time типа float. Если типа double, то менялось с любой моделью?
Pro_ha
1 / 1 / 0
Регистрация: 07.06.2013
Сообщений: 32
07.06.2013, 10:24  [ТС]     Почему точность Double такая же как у Float ? #3
У меня стоит модель "точная", но и другие модели не меняют ситуацию. 65536.0 + 0.003 = 65536.000000000000
Судя по тому, что дебагер выдает много знаков после запятой, это все таки тип double. У float показывало бы 65536.000
Блин, в чем же дело.
-=ЮрА=-
Заблокирован
Автор FAQ
07.06.2013, 11:06     Почему точность Double такая же как у Float ? #4
Pro_ha, при выводе на экран без специальнго манипулятора что float что double выводятся с 6-ю знаками (это умолчание на вывод), чтобы вывести больше знаков необходимо использовать std::setpecision из iomanip
-=ЮрА=-
Заблокирован
Автор FAQ
07.06.2013, 11:12     Почему точность Double такая же как у Float ? #5
Для наглядности
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iomanip>
#include <iostream>
using namespace std;
 
int main()
{
    double val = 0.123456789;
    cout<<val<<endl;
    cout<<setprecision(10)<<val<<endl;
 
    val += 0.0000001;
    cout<<setprecision(6) <<val<<endl;
    cout<<setprecision(10)<<val<<endl;
    cin.get();
    return 0;
}
Миниатюры
Почему точность Double такая же как у Float ?  
dstat
36 / 38 / 1
Регистрация: 01.06.2011
Сообщений: 238
07.06.2013, 11:41     Почему точность Double такая же как у Float ? #6
вы бы проект выложили, так то что гадать?
Pro_ha
1 / 1 / 0
Регистрация: 07.06.2013
Сообщений: 32
07.06.2013, 11:46  [ТС]     Почему точность Double такая же как у Float ? #7
Я не на экран вывожу, а сразу в дебагере смотрю значения переменных.

Кажется, я уже понял в чем дело. Это просто ахтунг. Если я правильно понял из этой темы:
http://www.gamedev.ru/code/forum/?id=132564 то DirectX устанавливает точность сопроцессора в одинарную (в зависимости от битности системы). И мой double вычисляется с точностью float-а. Если даже в исходнике движка создавать Direct3D, указывая точность потока, то в мсдн пугают какими то не предвиденными ситуациям в этом случае.

Короче, все эти float-double крайне не надежны. Точность не предсказуема. Интересно, существует ли либа программных(а не аппаратных) вещественных чисел? Ведь ничего не остается как использовать новый тип.
dstat
36 / 38 / 1
Регистрация: 01.06.2011
Сообщений: 238
07.06.2013, 12:06     Почему точность Double такая же как у Float ? #8
есть softfloat http://www.jhauser.us/arithmetic/SoftFloat.html
считается референсной реализацией
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.06.2013, 12:15     Почему точность Double такая же как у Float ?
Еще ссылки по теме:

C++ Как мне программу с int переделать в Float i double?
Преобразовать 2 числа int в 1 число float(double) | double int1.int2 C++
Почему мы пишем double x (double y)? а не через запятую double x,y C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Pro_ha
1 / 1 / 0
Регистрация: 07.06.2013
Сообщений: 32
07.06.2013, 12:15  [ТС]     Почему точность Double такая же как у Float ? #9
Спасибо, а что значит референсная реализация?
Yandex
Объявления
07.06.2013, 12:15     Почему точность Double такая же как у Float ?
Ответ Создать тему
Опции темы

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