Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> float или double ? Нужен ли float.. 
:(
    Опции темы
bsa
Дата 16.7.2013, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(hoz @  16.7.2013,  21:42 Найти цитируемый пост)
Ничего там непонятно вообще, если честно.

А чего непонятного? Число с плавающей точкой состоит из 3-х частей: знак (-1 или +1), мантисса (от 0 до 1) и экспонента (от -128 до +127). Фактическое число получается так: s * m * 2 ^ e. Подробнее в  вики
PM   Вверх
akizelokro
Дата 16.7.2013, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



Цитата(Wuffur @  15.7.2013,  11:43 Найти цитируемый пост)
А вот если я ему скажу, что на два это число делить можно, а на большее целое будет ноль - это будет ответ на вопрос?
Может он сам додумает?
С вашим ответом, что в DJGPP всё устроено как в 286 и 386 вряд ли понятнее станет. Я вот знаю, что сопроцессор для вычислений с плавающей
точкой появился только на 386 DX-2 и там ни о каких double речи не шло. Просто Doom 2 быстрее стал идти.


Не знаю. Я помню, что в fortran'e тогда были float, и double precision, и все равно не хватало, стали вводить huge.
Но с huge слава богу дело так и не пошло, сейчас глянул, там есть extended precision c 16 байтами под число.

Добавлено через 10 минут и 35 секунд
Цитата(hoz @  16.7.2013,  20:42 Найти цитируемый пост)
Ничего там непонятно вообще, если честно. Думал что всё понятно, а как начал там читать, так затуманило. Наверное лучше оставить "как есть", ведь различия в применении типов переменных я выяснил, а дальше уже дебри.. Который пугают smile  А изучать я нацелен серьёзно, поэтому лучше не перегрузить себя, видимо.


так будет лучше всего. просто знай вот эту разницу, а если ты не занимаешься конкретной тематикой, где нужна точность, тебе это знание может и не пригодиться никогда. Выпавший зуб даю!  smile 

Просто прими как данное, что для универсальности в С/C++, да и не только есть много вещей, которые, создавайся язык прямо сейчас, были бы не нужны 15-20 лет назад чуть ли не байты считались, чтобы уменьшить размер исполняемой программы. Поэтому, imho, тогда и была введена разница между int и long, например. Но остались и старые программы кое-где и старый код. Остаётся либо жертвовать обратной совместимостью и универсалностью, либо сейчас думать, зачем нужно такое конкретное разделение между целочисленными int и long, когда на современной технике возможная разница между ними уже ничего не значит. Почти не значит. 


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
hoz
Дата 17.7.2013, 00:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 27.6.2013

Репутация: нет
Всего: нет



Вот скрин страницы учебника:
user posted image
Как выше обсуждалось, неявное приведение типов отрабатывается в случает надобности, если того требует ситуация (наличие переменные разного типа в выражении).
Тут то ли перевод нечёткий, то ли автор не так выразился. Решил я переспросить. Там сказано, что:
Цитата

Тип double - это тип с плавающей точкой во многом похож на float, но переменны типа double могут хранить значения, много большие, чем переменные типа float, и с большей точностью. Константы (такие как 1000.0 и .05) требуют в С++ использования типа double.

Но точность переменных типа float 7-8 знаков, а значит 1000.0 и .05 вполне потянет тип float, а значит не разумно производить неявные преобразования и расчёт с данными переменными в таком виде... Я прав?
Ведь 1000.0 - тут порядок мантиссы 1, а у .05 - 2. Как раз float тут самое то, т.к. по скорость расчёта, так и потому, что он поддерживает данную точность. А автор учебника утверждает, что типа нет судя по контексту.
PM MAIL   Вверх
feodorv
Дата 17.7.2013, 07:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



"Структура for"? В смысле "управляющая структура кода" (или "структурный оператор")? Почему не просто "оператор цикла for" - получилось бы два раза рядом стоящих слова "оператор"?


Цитата(hoz @  17.7.2013,  01:14 Найти цитируемый пост)
а значит 1000.0 и .05 вполне потянет тип float

Потянет.


Цитата(hoz @  17.7.2013,  01:14 Найти цитируемый пост)
Как раз float тут самое то, т.к. по скорость расчёта, так и потому, что он поддерживает данную точность. А автор учебника утверждает, что типа нет судя по контексту. 

Наверное, он всё-таки хотел иметь в виду другое. Математические функции, определённые в заголовке math.h, практически все работают с double, в том числе и pow. Особого смысла (в данном примере) преобразовывать float-аргумент к double, а затем результат из double во float, нет. Поэтому будем работать с double:
Цитата

Функция pow требует аргументов типа double.

А то, что дальше 
Цитата(hoz @  17.7.2013,  01:14 Найти цитируемый пост)
Константы (такие как 1000.0 и .05) требуют в С++ использования типа double.

мне видится как копипаст от предыдущего утверждения.


Какие проблемы. Пробуйте с float. Потом сравните результаты с double. Для большого числа лет результат должен заметно отличаться... Для 10 - незначительно...


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
hoz
Дата 17.7.2013, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 27.6.2013

Репутация: нет
Всего: нет



Цитата(feodorv @  17.7.2013,  07:02 Найти цитируемый пост)
Какие проблемы. Пробуйте с float. Потом сравните результаты с double. Для большого числа лет результат должен заметно отличаться... Для 10 - незначительно... 

Как это пробывать? Ведь сказано же тут, что:
Цитата

Все эти функции принимают double, если не определено иначе. Для работы с типами float и long double используются функции с постфиксами f и l соответственно.

Получается, преобразование происходит даже когда нет необходимости.. Я вот заметил, что это не разумно. Потому и спросил.
Ведь если не требуется высокая точность, а расчёт её учитывает, как это иначе понимать?
PM MAIL   Вверх
Alexeis
Дата 17.7.2013, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 4
Всего: 459



  На самом деле сопроцессор можно настроить на точность вычислений. Можно сделать так, чтобы он считал даблы с точностью флоатов (библиотеки DirectX так и делают) . Вообще, преобразование операция простая, так что можно не париться.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
feodorv
Дата 17.7.2013, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(hoz @  17.7.2013,  13:18 Найти цитируемый пост)
Как это пробывать

Напишите свою fnpow smile 
Код

float fnpow( float v, int n)
{
  float p = v;
  int reverse = 0;

  if( n == 0 ) return 1.;
  if( n < 0 )
  {
    reverse = 1;
    n = -n;
  }

  while( --n > 0 ) p *= v;

  return reverse ? 1./p : p;
}



Цитата(hoz @  17.7.2013,  13:18 Найти цитируемый пост)
преобразование происходит даже когда нет необходимости.

Необходимость есть, и связана она с типом аргумента функции pow. Вот если была бы библиотечная функция fpow(float,float), тогда другое дело. Но что есть, то есть.

Мне всё же не понятно возмущение по поводу double. Ныне (если не брать в рассмотрение особые случаи) это стандартная единица для представления чисел с плавающей точкой. Современные (со)процессоры работают именно с double (хотя Вам кажется, что с float). То есть даже если вы будете пользоваться float, процессор всё равно преобразует float в double (а то и в long double), и уже потом будет складывать, вычитать, умножать, делить etc. Даже printf не умеет печатать float, минимум double (хотя scanf умеет работать с float).



--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
hoz
Дата 17.7.2013, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 27.6.2013

Репутация: нет
Всего: нет



Цитата(feodorv @  17.7.2013,  13:54 Найти цитируемый пост)
Необходимость есть, и связана она с типом аргумента функции pow. Вот если была бы библиотечная функция fpow(float,float), тогда другое дело. Но что есть, то есть.

Получается тут "виновник торжеств" не функция pow, а аргументы... Автор выразился видимо не особо внятно, по крайне мере я так подумал. Теперь понял.
Хотя проще же было сделать по дефолту, чтоб типы данных в аргументах функции pow были пользовательскими. Это же логично..

Цитата(feodorv @  17.7.2013,  13:54 Найти цитируемый пост)
Мне всё же не понятно возмущение по поводу double. Ныне (если не брать в рассмотрение особые случаи) это стандартная единица для представления чисел с плавающей точкой.

Получается, опять же float как тип уже не востребован, что и требовалось доказать. Если уж его игнорят современные процы.



Это сообщение отредактировал(а) hoz - 17.7.2013, 14:26
PM MAIL   Вверх
Alexeis
Дата 17.7.2013, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 4
Всего: 459



Цитата(feodorv @  17.7.2013,  14:54 Найти цитируемый пост)
Современные (со)процессоры работают именно с double (хотя Вам кажется, что с float). То есть даже если вы будете пользоваться float, процессор всё равно преобразует float в double (а то и в long double), и уже потом будет складывать, вычитать, умножать, делить etc.

  Это давнее заблуждение. То что регистры двойной точности еще не значит, что вычисления выполняются одинаково быстро. Арифметические плюс минус умножить делить, возможно, да и то деление и умножение наверняка с флоатми заметно быстрее. А если перейти к тригонометрическим функциям, то картина меняется кардинально. Время вычисления тригонометрических функций растет значительно быстрее чем точность. В некоторых компиляторах отсутствуют функции sinf, точнее они реализуются через sin , поэтому там нет разницы float/double, но это нифига не правило. На отдельных алгоритмах с использованием функций типа sin/arctan/sqrt у меня получалась разница в 50 раз и больше. Это небо и земля. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Wuffur
  Дата 17.7.2013, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 22.7.2007

Репутация: нет
Всего: нет



Машинное эпсилон для IEEE 08 float32: 2^-24 = 5.96e-08 , так что почему нельзя 1.000001eN, где 0.000 0001 = 1*10^-7 я не знаю.    
Для самообразования: http://en.wikipedia.org/wiki/Machine_epsilon

Это сообщение отредактировал(а) Wuffur - 17.7.2013, 14:40
PM MAIL ICQ   Вверх
feodorv
Дата 17.7.2013, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(Wuffur @  17.7.2013,  15:38 Найти цитируемый пост)
Машинное эпсилон для IEEE 08 float32: 2^-24 = 5.96e-08 , так что почему нельзя 1.000001eN, где 0.000 0001 = 1*10^-7 я не знаю.

Я написал: "к примеру" smile Точное значение лень было искать. За ссылку спасибо)))


Цитата(Alexeis @  17.7.2013,  15:31 Найти цитируемый пост)
Это давнее заблуждение.

Ок)))


Цитата(hoz @  17.7.2013,  15:21 Найти цитируемый пост)
Получается, опять же float как тип уже не востребован

Ну почему. Если Вам критично использование памяти и не критична точность с расширенным диапазоном, тогда float является спасением (если, конечно, на Вашей платформе float "в два раза меньше места занимает"))).
Вот и Alexeis говорит, что кое-где весьма бережно относятся к float. И таки дают функции с float'ами.
Ещё выше писали про графику, SSE и т.д.

float используется, и используется активно)))


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Alexeis
Дата 17.7.2013, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 4
Всего: 459



  У кого есть поновее компилятор под рукой проверьте следующий код
Код

    SetThreadAffinityMask(GetCurrentThread(), 1);
    LARGE_INTEGER l11, l12;
    LARGE_INTEGER l21, l22;
    float  fres;
    double dres;
    _control87(_MCW_PC, _PC_24); 
    QueryPerformanceCounter(&l11);
    for (float i = 0.0f; i < 1000000.0f; i += 1.0f)
        fres = sinf(i);    
    QueryPerformanceCounter(&l12);
    int count1 = (l12.QuadPart - l11.QuadPart);
    _control87(_MCW_PC, _PC_64); 
    QueryPerformanceCounter(&l21);
    for (double i = 0.0; i < 1000000.0; i+=1.0)
        dres = sin(i);    
    QueryPerformanceCounter(&l22);
    int count2 = (l22.QuadPart - l21.QuadPart);

    std::cout << count1 << " " << count2;
    std::string s;
    std::cin >> s;
    return 0;


Старичок VS2005 выдал флоаты в 2 раза медленнее даблов, но есть подозрение, что у него нет sinf . С графикой я четко замечал влияние _control87(_MCW_PC, _PC_ХХ); Т.е. несмотря на 64х битность сопроцессора он вполне умеет считать и с пониженной точностью для флоатов.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
hoz
Дата 17.7.2013, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 27.6.2013

Репутация: нет
Всего: нет



 Тема разраслась, начались вещи писаться, который уже за гранью темы и моего понимания в частности.

Я выше уже спрашивал про то, как понять:
Цитата

число с плавающей точкой имеет фиксированную относительную точность и изменяющуюся абсолютную

Например, берём числа:
123245.84,
457235.1,
235,6882347
У каждого из них будет фиксированная точность и изменяющаяся? Я сколько не читаю про это, что-то не въезжаю.
PM MAIL   Вверх
feodorv
Дата 18.7.2013, 08:30 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Давайте так. Кроме представления чисел в форме "числа с плавающей точкой" есть представление числа в форме "число с фиксированной точкой". С точки зрения точности представления чисел эти две формы являются противоположными:

Для чисел с фиксированной точкой
  • постоянная абсолютная погрешность
  • переменная относительная погрешность
Для чисел с плавающей запятой
  • переменная абсолютная погрешность
  • постоянная относительная погрешность
Поэтому на этих понятиях так акцентируется внимание. Теорию можно познать здесь.


Конкретное число x в машинном представлении (в силу ограниченности возможностей представления различных чисел на ЭВМ) может являться совсем другим числом X (округлённым до ближайшего "машинного" числа). Поэтому возникает погрешность машинного представления: вместо x имеем X. Задача: оценить эту погрешность. 

Погрешность можно оценить в лоб: |x-X| - насколько расхождение абсолютно. Можно более тонко - соизмерять с исходным числом: |x-X|/|x| - это уже относительная погрешность. К примеру: в корпорации "РосМама" счётная палата выявила финансовую отчётность на 99 млрд рублей из 100 млрд финансирования, а в компании "ВасяПупкин" смогли оправдаться за 300 тысяч из 400 тыс бюджета. Вопрос: кто из них больший растратчик?

Так вот с точки зрения относительной погрешности "РосМама" растратила всего 1%:
Цитата
| 100 - 99 | / 100 = 0.01
а "ВасяПупкин" - целых 25% своего бюджета:
Цитата
| 400 - 300 | / 400 = 0.25
. Следовательно эффективность усвоения бюджетных средств у "РосМама" значительно выше. В тоже время в абсолютных цифрах всё выглядит несколько иначе: 1 млрд рублей vs 100 тысяч.

Цитата(hoz @  17.7.2013,  23:31 Найти цитируемый пост)
У каждого из них будет фиксированная точность и изменяющаяся?

Вот причём здесь конкретное число? И куда делись основополагающие термины "относительная" и "абсолютная"?


Для любого X в форме числа с плавающей точкой верно:
  • постоянная относительная погрешность эпсилон (см. по ссылке Wuffur) (не зависит от X и его порядка)
  • переменная абсолютная погрешность (X * эпсилон) - зависит от числа X (и его порядка)


Это сообщение отредактировал(а) feodorv - 18.7.2013, 08:51


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
volatile
Дата 18.7.2013, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(Alexeis @  17.7.2013,  17:31 Найти цитируемый пост)
 проверьте следующий код

Alexeis, так время измерять нельзя!
Оптимизатор там просто вообще выбрасывает холостые циклы, так как результат никуда не используюцца.
У меня ваш код выдавал крайне не стабильные результаты
При добавления накопления и вывода результата, время вычислений возросло на 2 порядка (~100 раз)!!!
(что явно свидетельствует что в вашем коде, оптимизатор просто выбрасывал не нужные вычисления)
И время, после коррекции стало примерно одинаковым (+/-2%).

Кроме того там есть и еще ошибки.
Цитата(Alexeis @  17.7.2013,  17:31 Найти цитируемый пост)
   _control87(_MCW_PC, _PC_24); 

Если не ошибаюсь, вы здесь перепутали местами маску и значение.
То есть нужно писать наоборот:
Код

_control87(_PC_24, _MCW_PC);

проверьте здесь


PM MAIL   Вверх
Страницы: (5) Все 1 2 [3] 4 5 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1685 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.