Сведения о вопросе

nikolya

04:40, 13th August, 2020

Теги

c   math   google-search    

Глюк калькулятора Google, может ли float vs double быть возможной причиной?

Просмотров: 467   Ответов: 7

Я сделал это просто для удовольствия (так что, не совсем вопрос, я вижу, что downmodding уже происходит), но вместо новообретенной неспособности Google правильно делать математику (проверьте это! согласно google 500,000,000,000,002-500,000,000,000,001 = 0), я решил, что попробую следующее в C, чтобы запустить небольшую теорию.

int main()
{
   char* a = "399999999999999";
   char* b = "399999999999998";

   float da = atof(a);
   float db = atof(b);

   printf("%s - %s = %f\n", a, b, da-db);

   a = "500000000000002";
   b = "500000000000001";
   da = atof(a);
   db = atof(b);
   printf("%s - %s = %f\n", a, b, da-db);
}

При запуске этой программы вы получаете следующее

   399999999999999 - 399999999999998 = 0.000000
   500000000000002 - 500000000000001 = 0.000000

Казалось бы, Google использует простую 32-битную плавающую точность (ошибка здесь), Если вы переключите float на double в приведенном выше коде, вы исправите проблему! Может быть, это оно и есть?

/mp



  Сведения об ответе

VERSUION

16:41, 23rd August, 2020

Для получения дополнительной информации о такого рода глупости смотрите эту хорошую статью, относящуюся к калькулятору Windows.

Когда вы меняете внутренности, никто этого не замечает

Внутренности Calc-арифметика двигатель - был полностью выброшен и переписали с нуля. То стандартная библиотека IEEE с плавающей запятой был заменен на арифметика произвольной точности библиотека. Это было сделано после того, как люди продолжал писать ha-ha статью о том, как Calc не мог делать десятичную арифметику правильно, что например вычислительные 10.21 - 10.2 привели к 0.0100000000000016.


  Сведения об ответе

lourence

01:32, 27th August, 2020

Казалось бы, Google использует простую 32-битную плавающую точность (ошибка здесь), Если вы переключите float на double в приведенном выше коде, вы исправите проблему! Может быть, это оно и есть?

Нет, вы просто отложите этот вопрос. двойники по-прежнему демонстрируют ту же проблему, только с большими числами.


  Сведения об ответе

PROGA

14:04, 21st August, 2020

в C#, попробуй (double.maxvalue == (double.maxvalue - 100)) , ты получишь истину ...

но так оно и должно быть:

http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems

думая об этом, у вас есть 64 бит, представляющий число больше, чем 2^64 (double.maxvalue), поэтому ожидается неточность.


  Сведения об ответе

ASER

01:37, 2nd August, 2020

@ebel

думая об этом, у вас есть 64 бит, представляющий число больше, чем 2^64 (double.maxvalue), поэтому ожидается неточность.

2^64-это не максимальное значение двойника. 2^64 - это число уникальных значений, которые может содержать double (или любой другой 64-разрядный тип). Double.MaxValue равно 1.79769313486232e308.

Неточность с числами с плавающей запятой не возникает из-за представления значений больше, чем Double.MaxValue (что невозможно, исключая Double.PositiveInfinity ). Это происходит из - за того, что желаемый диапазон значений просто слишком велик, чтобы вписаться в тип данных. Поэтому мы отказываемся от точности в обмен на больший эффективный диапазон. В сущности, мы отбрасываем значимые цифры в обмен на больший диапазон экспонент.

@DrPizza

Даже нет; кодировки IEEE используют несколько кодировок для одних и тех же значений. В частности, NaN представляется показателем степени all-bits-1, а затем любым ненулевым значением для мантиссы. Таким образом, есть 252 NaNs для парных, 223 NaNs для одиночных.

Правда. Я не учел повторяющиеся кодировки. Хотя на самом деле есть 2 52 -1 NaNs для парных и 2 23 -1 NaNs для одиночных. :p


  Сведения об ответе

SSESION

01:20, 9th August, 2020

2^64-это не максимальное значение двойника. 2^64 - это число уникальных значений, которые может содержать double (или любой другой 64-разрядный тип). Double.MaxValue равно 1.79769313486232e308.

Даже нет; кодировки IEEE используют несколько кодировок для одних и тех же значений. В частности, NaN представляется показателем степени all-bits-1, а затем любым ненулевым значением для мантиссы. Таким образом, есть 2 52 NaNs для парных, 2 23 NaNs для одиночных.


  Сведения об ответе

9090

23:44, 23rd August, 2020

Правда. Я не учел повторяющиеся кодировки. Хотя на самом деле есть 252-1 NaNs для парных и 223-1 NaNs для одиночных. :p

Дох, забыл вычесть бесконечности.


  Сведения об ответе

JUST___

17:02, 12th August, 2020

Приблизительная версия этой проблемы, которую я узнал, состоит в том, что 32-разрядные поплавки дают вам 5 цифр точности, а 64-разрядные поплавки дают вам 15 цифр точности. Это, конечно, будет варьироваться в зависимости от того, как кодируются поплавки, но это довольно хорошая отправная точка.


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться