Огромная разница.
Как следует из названия, a double
имеет в 2 раза большую точность, чем float
[1] sup>. В общем случае a double
имеет 15 десятичных цифр точности, в то время как float
имеет 7.
Вот как рассчитывается количество цифр:
double
имеет 52 бита мантиссы + 1 скрытый бит: log (2 53 sup>) ÷ log (10) = 15,95 цифры
float
имеет 23 бита мантиссы + 1 скрытый бит: log (2 24 sup>) ÷ log (10) = 7,22 цифры
Эта потеря точности может привести к увеличению ошибок усечения при повторных вычислениях, например
float a = 1.f / 81;
float b = 0;
for (int i = 0; i < 729; ++ i)
b += a;
printf("%.7g\n", b); // prints 9.000023
, в то время как
double a = 1.0 / 81;
double b = 0;
for (int i = 0; i < 729; ++ i)
b += a;
printf("%.15g\n", b); // prints 8.99999999999996
Кроме того, максимальное значение float составляет около 3e38
, а double - около 1.7e308
, поэтому использование float
может поразить «бесконечность» (т.е. специальное число с плавающей точкой) гораздо проще, чем double
для чего-то простого, например вычисление факториала 60.
Во время тестирования, возможно, несколько тестовых примеров содержат эти огромные числа, которые могут привести к сбою ваших программ, если вы используете float.
Конечно, иногда даже double
недостаточно точен, поэтому у нас иногда есть long double
[1] sup> (в приведенном выше примере на Mac 9.0000000000000066), но все Типы с плавающей запятой страдают от ошибок округления , поэтому, если точность очень важна (например, обработка денег), вы должны использовать int
или класс дроби.
Кроме того, не используйте +=
для суммирования большого числа чисел с плавающей запятой, так как ошибки быстро накапливаются. Если вы используете Python, используйте fsum
. В противном случае попробуйте реализовать алгоритм суммирования Кахана .
[1]: стандарты C и C ++ не определяют представление float
, double
и long double
. Вполне возможно, что все три реализованы как IEEE двойной точности. Тем не менее, для большинства архитектур (gcc, MSVC; x86, x64, ARM) float
действительно действительно число с плавающей запятой IEEE с одинарной точностью (binary32), а double
равно число с плавающей точкой двойной точности IEEE (binary64). sup>
Обновление
HebMorph
Из любопытства, вызванного вашим вопросом, я связался с Itamar Сын-Хершко, который был активен в списках рассылки Lucene около года назад, когда работал над анализатором иврита для Lucene. Я спросил его, закончил ли он свой анализатор. Вот некоторые важные моменты из его ответа:
Короче говоря, нет, я не сделал. Нет достойных бесплатных / анализатор иврита с открытым исходным кодом для Lucene, это я могу сказать точно. я не уверен, о чем ты предмет, но поверьте мне, когда я говорю нет простого способа сделать это; Это может быть, Люцен не построен для поиска на иврите, но я согласен решение должно быть дано. Конечно, самый безопасный способ индексирования и поиска на иврите тексты - использовать специализированный стеммер, и интеграция с Lucene не является проще всего даже после того, как вы это сделаете. Есть несколько очень хороших решений для поиска на иврите в маркете только один, о котором я знаю, использует Lucene в это ядро; Я недавно пробовал связаться с ними, ответа пока нет ...
Упомянутый коммерческий продукт, основанный на Lucene, называется ATTIVIO, и веб-сайт ATTIVIO утверждает, что поддерживает иврит. В SIGTRS (группа по поиску текста на иврите) была некоторая дискуссия относительно ATTIVIO , в которой утверждается, что он основан на Lucene.
Таким образом, очевидно, можно создать достойный Анализатор на иврите для Lucene, но в настоящее время бесплатный анализатор недоступен.
dtsearch имеет плагин для ивритского стемминга под названием "pensim". Похоже, что он разработан компанией "wizcomtech.com".