Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Нормализация double
 
 автор: Eugene77   (15.03.2012 в 13:29)   письмо автору
 
 

Я ищу минимум многомерной плавной функции.
Ставлю точки по определённому алгоритму но так, чтобы они всегда попадали
в узлы заданной мною сетки (между точками в направлении каждого измерения своё равное расстояние).

Но в результате вычислений, когда, например, из координаты узла я вычитаю величину расстояния между точками, а потом её прибавляю я получаю иное число:

$x+$step-$step != $x

Это результат округления.
Когда я сохраняю в БД координаты уже обсчитанных точек, чтобы второй раз не считать, и
придумав новую точку делаю в начале выборку из БД на предмет того, обсчитывалась ли данная точка прежде, то часто получаю ошибочный результат.

Есть разные пути решения этой проблемы.
Но в данной теме, я хотел спросить:

Кто знает способ нормализации double в РНР?

  Ответить  
 
 автор: cheops   (15.03.2012 в 16:13)   письмо автору
 
   для: Eugene77   (15.03.2012 в 13:29)
 

>Это результат округления.
Почему округления, а не накопления ошибки вычисления? Как раз бы тут пригодилась функция round() с её способностью округлять до заданного знака после запятой.

  Ответить  
 
 автор: Eugene77   (16.03.2012 в 08:22)   письмо автору
 
   для: cheops   (15.03.2012 в 16:13)
 

>>Это результат округления.
>Почему округления, а не накопления ошибки вычисления? Как раз бы тут пригодилась функция round() с её способностью округлять до заданного знака после запятой.


Да, конечно, накопления ошибки.
Только, round() не совсем удобен в моём случае.
Параметров много, и их часть из них меняются в пределах тысяч, другие в пределах тысячных, поэтому надо разные аргументы раунду передавать.

Меня бы больше устроил такой подход:
1) Double преобразуется в строку с максимальной точностью
2) Последние 2 значащие цифры отбрасываются
3) С правой стороны тримятся нули
4) Обратно в double

Но я подозреваю, что при преобразовании числа в строку, РНР и так делает что-то в этом роде.

Поэтому и спрашиваю

  Ответить  
 
 автор: task   (16.03.2012 в 08:52)   письмо автору
 
   для: Eugene77   (16.03.2012 в 08:22)
 

Прочтите о представлении чисел в памяти.

  Ответить  
 
 автор: Eugene77   (16.03.2012 в 12:46)   письмо автору
 
   для: task   (16.03.2012 в 08:52)
 

Прочитал, но не увидел связи с темой

  Ответить  
 
 автор: task   (16.03.2012 в 15:47)   письмо автору
 
   для: Eugene77   (16.03.2012 в 12:46)
 

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

  Ответить  
 
 автор: Eugene77   (16.03.2012 в 16:54)   письмо автору
 
   для: task   (16.03.2012 в 15:47)
 

>Вы заговорили о представлении,
Меня не общая теория итересует, а чисто прикладная сторона, как именно в РНР происходит преобразование даблов в строку.
Поскольку прямое применение Round не слишком удобно в моём случае.

Возможно, кто-то уже сталкивался с потребностью такой формы округления, как я.

Может, вариант рабочего кода напишет. У меня, лично функция сложная получается.
Боюсь, сразу без ошибок не получится, да и медленно работать будет.

  Ответить  
 
 автор: cheops   (16.03.2012 в 17:06)   письмо автору
 
   для: Eugene77   (16.03.2012 в 16:54)
 

Воспользуйтесь sprintf(), задав явное количество нулей после запятой - вам будет проще.

  Ответить  
 
 автор: cheops   (16.03.2012 в 16:46)   письмо автору
 
   для: Eugene77   (16.03.2012 в 08:22)
 

Хм... может воспользоваться функцией sprintf()?

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования