Функция тригонометрии (cos), возвращающая другое значение в калькулятор
Когда я использую функцию cos на калькуляторе, cos(0) = 1, cos(90) = 0, cos(180) = -1 и cos(270) = 0. Однако я не знаю, как получить эти результаты в моем код. Результат, который я получаю в своем коде, равен 1 или -1, но никогда не равен 0. Ниже приведено то, что я пробовал, и никто не дает мне такие же результаты, как калькулятор, что мне не хватает?
print(cos(0)) // receiver error "Ambiguous use of 'cos'"
print(cos(90)) // receiver error "Ambiguous use of 'cos'"
print(cos(180)) // receiver error "Ambiguous use of 'cos'"
print(cos(270)) // receiver error "Ambiguous use of 'cos'"
print(cos(M_PI*0)) // returns 1
print(cos(M_PI*1)) // returns -1
print(cos(M_PI*2)) // returns 1
print(cos(M_PI*3)) // returns -1
print(cos(M_PI*0)) // returns 1
print(cos(M_PI*90)) // returns 1
print(cos(M_PI*180)) // returns 1
print(cos(M_PI*270)) // returns 1
print(cos(M_PI/M_PI-1)) // returns 1
print(cos(M_PI/M_PI+89)) // returns -0.44
print(cos(M_PI/M_PI+179)) // returns -0.59
print(cos(M_PI/M_PI+269)) // reutnrs 0.98
Ниже повторяется результаты 1, 0, -1, 0:
var x: Double = 0
while x < 100 {
print(Int(cos(M_PI*(x*0.5))))
x = x + 1
}
2 ответа
Darwin
Тригонометрические функции работают в радианах.
Выпуск 1.1
print(cos(0)) // receiver error "Ambiguous use of 'cos'"
print(cos(90)) // receiver error "Ambiguous use of 'cos'"
print(cos(180)) // receiver error "Ambiguous use of 'cos'"
print(cos(270)) // receiver error "Ambiguous use of 'cos'"
Они неоднозначны, потому что есть две версии cos, которые бывают двух типов:
(Double) -> Double
(Float) -> Float
И то и другое Double
а также Float
соответствовать ExpressibleByIntegerLiteral
так что оба могут быть выражены Int
, Не ясно, какой из двух типов Int
должен выразить.
Если вы хотите Double
версия, вы можете назвать это с:
cos(0 as Double)
cos(0.0)
потому что прямое использование floatliteral в качествеDouble
имеет приоритет перед конверсией черезexpressiblebyfloatliteral
,
Если вы хотите Float version
Вы можете позвонить с помощью: cos(0 as Float)
В обоих случаях неоднозначность может быть устранена, если контекст предоставляет достаточную информацию. Например:
functionThatTakesADouble(cos(0)) // will use the `(Double) -> Double` version
functionThatTakesAFloat(cos(0)) // will use the `(Float) -> Float` version
print(cos(M_PI*0)) // M_PI is a Double, so 0 is treated as a Double
Выпуск 1.2
После разрешения неоднозначности типа, вот так:
print(cos(0.0)) // 1.0
print(cos(90.0)) // -0.44807361612917
print(cos(180.0)) // -0.598460069057858
print(cos(270.0)) // 0.984381950632505
Мы получаем правильные ответы. Помните, что функции триггера системы работают в радианах.
Выпуск 2
print(cos(M_PI*0)) // returns 1
print(cos(M_PI*1)) // returns -1
print(cos(M_PI*2)) // returns 1
print(cos(M_PI*3)) // returns -1
Это все правильные значения.
Выпуск 3
print(cos(M_PI*0)) // returns 1
print(cos(M_PI*90)) // returns 1
print(cos(M_PI*180)) // returns 1
print(cos(M_PI*270)) // returns 1
Это тоже правильно. cos
является 1
для каждого четного кратного pi
радиан.
Выпуск 4
print(cos(M_PI/M_PI-1)) // returns 1
print(cos(M_PI/M_PI+89)) // returns -0.44
print(cos(M_PI/M_PI+179)) // returns -0.59
print(cos(M_PI/M_PI+269)) // reutnrs 0.98
M_PI/M_PI
является 1.0
(как Double
), поэтому эти случаи эквивалентны первому, но с дополнительной информацией о типе, необходимой для однозначного выбора компилятором (Double) -> Double
cos
над (Float) -> Float
,
Для неоднозначного использования проблемы cos используйте
Double(cos(90))
вместоcos(90)
. Вам следует указать Тип