programing tip

F #의 거듭 제곱 연산자가 부동 소수점 숫자에만 작동하는 이유는 무엇입니까?

itbloger 2020. 12. 26. 09:36
반응형

F #의 거듭 제곱 연산자가 부동 소수점 숫자에만 작동하는 이유는 무엇입니까?


나는 언어에 지수 또는 지수 연산자가 부동 소수점 숫자 만 취하는 것을 본 적이 없습니까?

예를 들면 :

2 ** 2 오류를 던진다 The type 'int' does not support any operators named 'Pow'

이 설계 결정에 대한 타당한 이유가 있습니까?


(**)그리고 pown다른 두 가지입니다. 를 보면 (**)로그를 사용하는 수학 공식을 생각할 수 있습니다. 를 보면 pown일련의 곱셈 일뿐입니다. 대부분의 다른 언어는 그러한 차이를 만들지 않기 때문에 처음에는 놀랍거나 혼란 스러울 수 있음을 이해합니다 (주로 정수는 종종 암시 적으로 부동 소수점 값으로 변환되기 때문입니다). 수학에서도 약간의 차이가 있습니다. Wikipedia 항목을 참조하세요 . 첫 번째 정의는 양의 정수 지수에 대해서만 작동합니다.

서로 다른 (하지만 관련이있는) 사물이므로 서명이 다릅니다. 여기 있습니다 (**):

^a -> ( ^b ->  ^a) when  ^a : (static member Pow :  ^a *  ^b ->  ^a)

그리고 여기 있습니다 pown:

^a -> (int ->  ^a)
when  ^a : (static member get_One : ->  ^a) and
      ^a : (static member ( * ) :  ^a *  ^a ->  ^a) and
      ^a : (static member ( / ) :  ^a *  ^a ->  ^a)

당신이 당신의 자신의 유형을 작성하는 경우, 당신은 당신이 필요합니다 One, (*)그리고 (/)이 작업을 얻을 pown. 라이브러리는 루프를 수행합니다 (최적화되었으며 순진한 O (n)이 아닙니다).

(**)정수가 아닌 값에 대해 유형에 연산자 를 사용하려면 전체 논리를 작성해야합니다 (에서와 동일한 알고리즘이 pown아님).

두 개념을 분리 한 것이 좋은 디자인 결정이라고 생각합니다.


적분 거듭 제곱의 경우 F #은 또 다른 연산자 pown. 또한, 사이드 참고로 모두 (**)와는 pown적절 부재 (정적를 제공하는 다른 타입들과 함께 사용하기 위해 완벽하게 가능하므로, 오버로드 Pow의 경우에있어서 (**), (*)그리고 (/)오퍼레이터 및 정적 One의 경우 속성 pown).

F # 팀이에서 Pow멤버 를 시뮬레이션하지 않기로 선택한 이유는 말할 수 없지만 연산자를 대신 사용할 수 int있었기 때문에 긴급하다고 생각하지 않았을 것입니다 pown(그리고 아마도 먼저 float로 변환하는 것이 더 합리적 일 것입니다. 큰 피연산자의 경우).


짧은 대답은 정수 유형, 심지어 int64에도 유용하지 않기 때문입니다. 2 ^ 26은 ~ 1.84467441E19 만 제공합니다. 따라서 두 개의 값 X와 Y가 모두 19보다 큰 경우 거듭 제곱 연산자가 오버플로를 발생시킵니다.

나는 그것이 작은 값에 유용하다는 데 동의하지만 일반적으로 정수 유형에는 유용하지 않습니다.


F #의 기반 언어는 연산자 오버로딩이나 자동 데이터 강제 변환을 수행하지 않는 OCaml입니다 (명시 적 강제 변환을 선호 함).

따라서 double을 추가하는 경우에도 다른 연산자 (+.)가 필요합니다. 이것이 F #이 그것에 대한 엄격함을 얻는 곳인지 확실하지 않지만 그것이 있다고 생각합니다.

Python 또는 Scheme과 같은 동적 언어에서는 숫자가 너무 크면 더 큰 데이터 저장소로 자동 데이터 강제 변환을 받게됩니다. 예를 들어 결과에 대해 큰 정수를 제공하는 정수 지수가있는 정수를 가질 수 있습니다.

OCaml 및 F #은 극도의 유형 안전 정신을 가지고 있습니다.

참조 URL : https://stackoverflow.com/questions/5334003/why-does-the-power-operator-in-f-only-work-for-floating-point-numbers

반응형