Помогите разобраться с вычислениями
От: notdefine  
Дата: 17.03.09 09:11
Оценка:
Есть вот такой код:
       protected override void OnMouseMove(MouseEventArgs e)
        {
            float x = e.X * Mpi.X, y = e.Y * Mpi.Y;
            _CalculateGeographPos(x, y);
            base.OnMouseMove(e);
        }
        private void _CalculateGeographPos(float x,float y)
        {
            this._xPos = (x - this._deltaX) / this._deltaS;
            this._yPos = (y - this._deltaY) / this._deltaS;
        }

И есть еще вот такой:
        protected override void OnMouseMove(MouseEventArgs e)
        {
            float x = e.X * Mpi.X, y = e.Y * Mpi.Y;
            this._xPos = (x - this._deltaX) / this._deltaS;
            this._yPos = (y - this._deltaY) / this._deltaS; 
            base.OnMouseMove(e);
        }

Так вот, меня интересуют значения _xPos и _yPos, в каждом примере их значения различаются на величину от 0,0001 до 0,00000006 примерно. Почему так происходит ?

17.03.09 13:17: Перенесено модератором из 'Java' — Blazkowicz
Re: Помогите разобраться с вычислениями
От: zubr Россия  
Дата: 17.03.09 09:17
Оценка:
Здравствуйте, notdefine, Вы писали:

N>Так вот, меня интересуют значения _xPos и _yPos, в каждом примере их значения различаются на величину от 0,0001 до 0,00000006 примерно. Почему так происходит ?

потому что float — вещественный тип, или тип с плавающей точкой. все операции с некоторой погрешностью. http://www.ibm.com/developerworks/java/library/j-jtp0114/
также найдете много информации в JLS.
если вы хотите сравнить два float point, то:
epsilon = 1e-6; //sample

equals a, b => abs(a-b) < epsilon;
Re: Помогите разобраться с вычислениями
От: KRA Украина  
Дата: 17.03.09 09:21
Оценка:
Здравствуйте, notdefine, Вы писали:

N>Так вот, меня интересуют значения _xPos и _yPos, в каждом примере их значения различаются на величину от 0,0001 до 0,00000006 примерно. Почему так происходит ?


у float-а точность около 7 десятичных знаков. Попробуёте использовать double, ну а вообще имейте ввиду это
Re: Помогите разобраться с вычислениями
От: LDimas Россия  
Дата: 17.03.09 09:24
Оценка:
Уверен что форумом не ошибся? Синтаксис то не джавный.
Re[2]: Помогите разобраться с вычислениями
От: zubr Россия  
Дата: 17.03.09 09:28
Оценка:
Здравствуйте, LDimas, Вы писали:

LD>Уверен что форумом не ошибся? Синтаксис то не джавный.

C# как минимум... но разницы все равно никакой нет float point operations всегда имеют некоторый порог погрешности
Re[3]: Помогите разобраться с вычислениями
От: LDimas Россия  
Дата: 17.03.09 09:30
Оценка: :))
Здравствуйте, zubr, Вы писали:

Z>Здравствуйте, LDimas, Вы писали:


LD>>Уверен что форумом не ошибся? Синтаксис то не джавный.

Z>C# как минимум... но разницы все равно никакой нет float point operations всегда имеют некоторый порог погрешности
Ну вы бедоного парня так активно отправляете к сановским докам, что стало немного не по себе ))))
Re[4]: Помогите разобраться с вычислениями
От: zubr Россия  
Дата: 17.03.09 09:33
Оценка:
Здравствуйте, LDimas, Вы писали:

LD>Здравствуйте, zubr, Вы писали:


Z>>Здравствуйте, LDimas, Вы писали:


LD>>>Уверен что форумом не ошибся? Синтаксис то не джавный.

Z>>C# как минимум... но разницы все равно никакой нет float point operations всегда имеют некоторый порог погрешности
LD>Ну вы бедоного парня так активно отправляете к сановским докам, что стало немного не по себе ))))
Re[2]: Помогите разобраться с вычислениями
От: notdefine  
Дата: 17.03.09 10:03
Оценка:
Здравствуйте, LDimas, Вы писали:

LD>Уверен что форумом не ошибся? Синтаксис то не джавный.

Да, у меня C#, случайно в яву попал вопрс... но от этого думаю не многое меняется, формат float`а на сколько мне известно идентичный у Java и C#
... Если ошибаюсь, то прошу прощения...
Re: Помогите разобраться с вычислениями
От: vmpire Россия  
Дата: 17.03.09 11:12
Оценка:
Здравствуйте, notdefine, Вы писали:

N>Есть вот такой код:

N>
N>       protected override void OnMouseMove(MouseEventArgs e)
N>        {
N>            float x = e.X * Mpi.X, y = e.Y * Mpi.Y;
N>            _CalculateGeographPos(x, y);
N>            base.OnMouseMove(e);
N>        }
N>        private void _CalculateGeographPos(float x,float y)
N>        {
N>            this._xPos = (x - this._deltaX) / this._deltaS;
N>            this._yPos = (y - this._deltaY) / this._deltaS;
N>        }
N>

N>И есть еще вот такой:
N>
N>        protected override void OnMouseMove(MouseEventArgs e)
N>        {
N>            float x = e.X * Mpi.X, y = e.Y * Mpi.Y;
N>            this._xPos = (x - this._deltaX) / this._deltaS;
N>            this._yPos = (y - this._deltaY) / this._deltaS; 
N>            base.OnMouseMove(e);
N>        }
N>

N>Так вот, меня интересуют значения _xPos и _yPos, в каждом примере их значения различаются на величину от 0,0001 до 0,00000006 примерно. Почему так происходит ?

Скорее всего, из-за оптимизации кода: во втором случае компилятор может объединить несколько вычислений в одно выражение и поэтому порядок действий изменится. Попробуйте посмотреть скомпилированный IL код и сравнить порядок вычислений.
А сама погрешность при разном порядке действий — из-за округлений числа с плавающей точкой, про которое уже написали.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.