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
|
|
07.06.2013, 09:05 | |
Ответы с готовыми решениями:
8
Почему float неявно преобразуется только к double? |
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
|
Заблокирован
![]() |
||||||
07.06.2013, 11:12 | 5 | |||||
Для наглядности
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
|
07.06.2013, 12:15 | |
Помогаю со студенческими работами здесь
9
Как обойтись без float, double, long double? Почему при преобразования из float в double коверкается число?
Преобразовать 2 числа int в 1 число float(double) | double int1.int2 Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |