Я хотел бы, чтобы приведенная ниже функция работала как со значениями Float, так и с Double:
func srgb2linear(_ S: Float) -> Float {
if S <= 0.04045 {
return S / 12.92
} else {
return pow((S + 0.055) / 1.055, 2.4)
}
}
Документация по Swift 4 говорит, что мне нужен FloatingPoint
универсальный, чтобы представлять как Float и двойные классы, например:
func srgb2linear<T: FloatingPoint>(_ S: T) -> T
Однако, когда я пытаюсь это сделать, он не компилируется со следующими ошибками:
Error: binary operator '<=' cannot be applied to operands of type 'T' and 'Double'
Error: binary operator '/' cannot be applied to operands of type 'T' and 'Double'
Error: binary operator '+' cannot be applied to operands of type 'T' and 'Double'
Как возможно, что для универсального представления чисел с плавающей запятой такие операторы не реализованы? А если не так, как я могу написать эту функцию в Swift?
12.92
и т. д. не распознаются как литералы с плавающей запятой, что можно решить, используя вместо этого BinaryFloatingPoint (сравните stackoverflow.com/a/48021458 /1187415). – Другая проблема заключается в том, что не существует универсальной функцииpow
. - person Martin R   schedule 13.02.2018BinaryFloatingPoint
. В нем говорится, что FP соответствуетComparable
и что BFP добавляет некоторые дополнительные операции, которые имеют смысл только для фиксированной системы счисления. - person hyperknot   schedule 13.02.20180.04045
и т. д., а также в функции pow. - person Martin R   schedule 13.02.2018