1 / 1 / 0
Регистрация: 07.06.2013
Сообщений: 39
1

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

07.06.2013, 09:05. Показов 1907. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вначале столкнулся с проблемой float:
time=65536.0f; (можно и больше число указать)
time+=0.003; Тут time не меняетя! Оно меняется, только если не меньше 0.004 прибавлять.
Понятно. Проблема с точностью. Но тип double, ведет себя точно также. И даже long double.

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

Добавлено через 35 минут
Создал чистый проект, в нем double работает как положено. Даже подключил все либы в той же последовательности. Работает. Значит где то в настройках проекта опция стоит. Но какая?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.06.2013, 09:05
Ответы с готовыми решениями:

Почему float и double округляют значения до целых?
Установил значит себе вижуал студио, решил прописать пробники И вот на этом примере: #include...

Почему типы float и double не работают с dynamic?
Почему типы float и double не работают с dynamic?

Почему нельзя делить с остатком float/double
Доброго времени суток, объясните мне, почему нельзя делить с остатком числа с точкой? К примеру...

Почему float неявно преобразуется только к double?
Почему float неявно преобразуется только к double? Почему нет неявного преобразования к decimal?

8
36 / 38 / 7
Регистрация: 01.06.2011
Сообщений: 237
07.06.2013, 09:24 2
c++->code generation-> floating point model
есть три модели fast, precise, strict
Но я попробовал, и ни в одной модели не наблюдал такого поведения. Вы точно уверены, что не меняется (у меня 65536,0f+0.003 не поменялось только если time типа float. Если типа double, то менялось с любой моделью?
0
1 / 1 / 0
Регистрация: 07.06.2013
Сообщений: 39
07.06.2013, 10:24  [ТС] 3
У меня стоит модель "точная", но и другие модели не меняют ситуацию. 65536.0 + 0.003 = 65536.000000000000
Судя по тому, что дебагер выдает много знаков после запятой, это все таки тип double. У float показывало бы 65536.000
Блин, в чем же дело.
0
Заблокирован
Автор FAQ
07.06.2013, 11:06 4
Pro_ha, при выводе на экран без специальнго манипулятора что float что double выводятся с 6-ю знаками (это умолчание на вывод), чтобы вывести больше знаков необходимо использовать std::setpecision из iomanip
0
Заблокирован
Автор FAQ
07.06.2013, 11:12 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 ?  
0
36 / 38 / 7
Регистрация: 01.06.2011
Сообщений: 237
07.06.2013, 11:41 6
вы бы проект выложили, так то что гадать?
0
1 / 1 / 0
Регистрация: 07.06.2013
Сообщений: 39
07.06.2013, 11:46  [ТС] 7
Я не на экран вывожу, а сразу в дебагере смотрю значения переменных.

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

Короче, все эти float-double крайне не надежны. Точность не предсказуема. Интересно, существует ли либа программных(а не аппаратных) вещественных чисел? Ведь ничего не остается как использовать новый тип.
0
36 / 38 / 7
Регистрация: 01.06.2011
Сообщений: 237
07.06.2013, 12:06 8
есть softfloat http://www.jhauser.us/arithmetic/SoftFloat.html
считается референсной реализацией
0
1 / 1 / 0
Регистрация: 07.06.2013
Сообщений: 39
07.06.2013, 12:15  [ТС] 9
Спасибо, а что значит референсная реализация?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.06.2013, 12:15
Помогаю со студенческими работами здесь

Как обойтись без float, double, long double?
К примеру мне надо в программе использовать что-то вроде -0,00000000000003626686812 и...

Почему при преобразования из float в double коверкается число?
float fll=34.23; cout &lt;&lt; &quot; fll=&quot;&lt;&lt; fll; //Вот тут я ввожу double dub; dub =...

Почему обычно используют для координат float, а не double?
Почему обычно используют на координатах float а не double? например в играх в той же библиотеке...

Преобразовать 2 числа int в 1 число float(double) | double int1.int2
Всем привет. Изучая азы C++, столкнулся с такой проблемой. Есть два значения типа int, их...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru