2015-03-11 3 views
1

У меня возникает странная проблема при вычислении расстояния латинского языка. Если я ввожу этот запрос в MySQLMySQL тригг математика для вычисления результатов расстояния в нуле

SELECT (3959 * acos(cos(radians(30.50492800)) * cos(radians(30.50492800)) * cos(radians(-90.49670600) - radians(-90.496706)) + sin(radians(30.50492800)) * sin(radians(30.50492800)))) 

это приводит к нулевой. Тем не менее, ввод

SELECT (3959 * acos(cos(radians(30.50492800)) * cos(radians(30.50492800)) * cos(radians(-90.49670600) - radians(-90.496706)) + sin(radians(30.50492800)) * sin(radians(30.50492700)))) 

или

SELECT (3959 * acos(cos(radians(30.50492800)) * cos(radians(30.50492800)) * cos(radians(-90.49670600) - radians(-90.49670)) + sin(radians(30.50492800)) * sin(radians(30.50492800)))) 

дает результат.

Любые причины, которые могут вызвать это?

ответ

2

Это не странно вообще,

ни один из 3-х выражений не вычислить то же самое.


Различия

SELECT (3959 * acos(cos(radians(30.50492800)) * cos(radians(30.50492800)) *cos(radians(-90.49670600) - radians(-90.496706)) + sin(radians(30.50492800)) *sin(radians(30.50492800))))

SELECT (3959 * acos(cos(radians(30.50492800)) * cos(radians(30.50492800)) *cos(radians(-90.49670600) - radians(-90.496706)) + sin(radians(30.50492800)) *sin(radians(30.50492700))))

SELECT (3959 * acos(cos(radians(30.50492800)) * cos(radians(30.50492800)) * cos(radians(-90.49670600) - radians(-90.49670)) + sin(radians(30.50492800)) * sin(radians(30.50492800))))


Оценка

  • Первое выражение
    1. cos(radians(30.50492800)) равна 0.861585503968495
    2. cos(radians(30.50492800)) равно 0.861585503968495
    3. cos(radians(-90.49670600) - radians(-90.496706)) равно 1
    4. sin(radians(30.50492800)) * sin(radians(30.50492800)) равно 0.257670419351355
    5. поэтому мы оцениваем 0.861585503968495 * 0.861585503968495 * 1 + 0.257670419351355, которые дают 1.000000000000000513393952565025
    6. acos(1.000000000000000513393952565025) возвращение нуль.
  • Второе выражение
    1. cos(radians(30.50492800)) равно 0.861585503968495
    2. cos(radians(30.50492800)) равно 0.861585503968495
    3. cos(radians(-90.49670600) - radians(-90.496706)) равно 1
    4. sin(radians(30.50492800)) * sin(radians(30.50492700)) равно 0.257670411718131
    5. так мы оцениваем 0.861585503968495 * 0.861585503968495 * 1 + 0.257670411718131 который 0.999999992366776513393952565025
    6. acos(0.999999992366776513393952565025) = 0.00
    7. 3959 * 0.00 = 0.489164001654431
  • Третье выражение
    1. cos(radians(30.50492800)) равна 0.861585503968495
    2. cos(radians(30.50492800)) равна 0.861585503968495
    3. cos(radians(-90.49670600) - radians(-90.49670)) равно 0.999999999999995
    4. sin(radians(30.50492800)) * sin(radians(30.50492800)) равно 0.257670419351355
    5. Таким образом, мы оцениваем 0.861585503968495 * 0.861585503968495 * 0.999999999999995 + 0.257670419351355 которые равны 0.999999999999996801746049321797
    6. acos(0.999999999999996801746049321797) равной 8.16170211889098e-08
    7. УМНОЖАЕМ 3959 и мы получаем 0.000323121786886894

Почему acos (1.000000000000000513393952565025) return null?

Из documentation,

Возвращает арккосинус X, то есть значение, косинус которого равен Х. Возвращает NULL, если Й не находится в диапазоне от -1 до 1.

Как вы можете видеть, 1.000000000000000513393952565025 выше, то 1.

для двух других выражений, которые не дают нуль, то данный параметр acos являются

  • 0,999999992366776513393952565025
  • 0,000323121786886894

которые оба в диапазоне [-1, 1] поэтому мы не получаем нуль.

+0

Спасибо, я добавил в диапазон проверки внутри acos, чтобы установить его в 1 или -1, если он был вне этого диапазона. – bezz

+0

@bezz Добро пожаловать. –

Смежные вопросы