[c++] преобразовать строку в double
“000093.0100” превращается в 93.099999999999994есть уверенность, что этой точности не хватит?
Выводи результат с точностью четыре знака после, будет тебе 0100.
Я пользовался функцией FloatToStr она выдавала подобные результаты, когда я присваивал значение переменной с типом float, заменил на double, все заработало.
А вообще, это не твоя проблема и не проблема алгоритма. Это проблема представления чисел в компе. Почитай стандарт IEEE-754
Вроде очевидно, что в 15-ом знаке после запятой не ноль будет.
Если тебе надо уметь представлять любое действительно число, то это невозможно в условиях ограниченной памяти. Если надо уметь представлять любое рациональное число, то используй представление m/n. Если надо уметь представлять любую конечную десятичную дробь, то используй m*10^n.
Вроде очевидно, что в 15-ом знаке после запятой не ноль будет.А вот и нет. С плавающей арифметикой ничего нельзя точно знать заранее.
А стандарт зачем придумали?
чтобы всё было одинаково неточно
Стандарт на операции FPU есть только в java и то он по умолчанию не включен вроде бы.
IEEE 754, которому следуют производители CPU и FPU?
К тому же тут заявляется, что Java следует именно этому стандарту.
А ты вычти 000093.0100 и то число, которое получится после преобразования и посмотри в каком знаке у тебя будет не ноль.
>>> 000093.0100 - 93.099999999999994фигасе, ну и точность....
-0.0899999999999892
фигасе, ну и точность....В постановке опечатка
In [1]: float('93.01')
Out[1]: 93.010000000000005
In [2]: float('93.1')
Out[2]: 93.099999999999994
А так точность 6 * 10 ^ -15 (тобишь 0.000000000000006)
Это стандарт на CPU и FPU, а не на то, что у тебя будет, если ты напишешь в каком-нибудь языке a+b - компиляторы могут реализовывать это по-разному (особенно если идет работа не с 80-битными числами).
Числа складываются на процессоре, способ сложения задается стандартом.
Чем по-твоему занимается компилятор?
А этими сопроцессорами еще не прекратили пользоваться?
Эта модель вычислений используется на всех x86 процессорах (в 32-битном режиме). Такое вот тяжёлое наследие, перенятое интелом у моторолы.
Кстати, что делает gcc, когда встречает, скажем, перемножение двух float-чисел?
Мне так показалось, что майкрософтовский компилятор старается производить
эти вычисления при помощи SSE, если такие ему доступны.
что делает gccТо, что ему скажут (см -mfpmath и -msse*)
Спасибо )
Оставить комментарий
neorus
Столкнулся с проблемой при работе над адаптером: не могу корректно преобразовать строку в double.Например, значение “000093.0100” превращается в 93.099999999999994 всеми тремя способами, найденными мной: