Функция тригонометрии (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) -> Doublecos над (Float) -> Float,

Для неоднозначного использования проблемы cos используйте

      Double(cos(90))

вместоcos(90). Вам следует указать Тип

Другие вопросы по тегам