IT이야기

계량분할(%)은 왜 정수만 사용하는가?

cyworld 2022. 5. 4. 21:43
반응형

계량분할(%)은 왜 정수만 사용하는가?

나는 최근에 계량분할을 사용하여 쉽게 해결될 수 있는 문제에 부딪혔지만, 그 입력은 부동액이었다.

주기적인 함수(예:sin) 및 기간 범위 내에서만 계산할 수 있는 컴퓨터 기능(예: [-computer, π]), 어떤 입력도 처리할 수 있는 기능을 만든다.

"확실한" 해결책은 다음과 같다.

#include <cmath>

float sin(float x){
    return limited_sin((x + M_PI) % (2 *M_PI) - M_PI);
}

왜 안 되지?다음 오류가 발생하는 경우:

error: invalid operands of types double and double to binary operator %

흥미롭게도, 그것은 파이톤에서 효과가 있다.

def sin(x):
    return limited_sin((x + math.pi) % (2 * math.pi) - math.pi)

왜냐하면 "제거자"라는 정상적인 수학적 개념은 정수분할, 즉 정수지수를 생성하는 데 필요한 분할에만 적용되기 때문이다.

"리메인더"의 개념을 실제 숫자로 확장하기 위해서는 실제 피연산자의 정수 지수를 생성하는 새로운 종류의 "하이브리드" 연산을 도입해야 한다.Core C 언어는 그러한 운영을 지원하지 않지만 C99의 기능뿐만 아니라 표준 라이브러리 기능으로 제공된다.(이 기능들은 동일하지 않고 일부 특색이 있다는 점에 유의한다.특히 정수분할의 반올림 규칙을 따르지 않는다.)

fmod()를 찾으시는 겁니다.

좀 더 구체적으로 당신의 질문에 대답하자면, 오래된 언어로는%연산자는 단지 정수 모듈식 분할로 정의되었고 새로운 언어에서는 연산자의 정의를 확장하기로 결정했다.

편집: 만약 내가 그 이유를 추측한다면, 모듈식 산술의 개념은 숫자 이론에서 비롯되고 특히 정수를 다루기 때문이라고 말할 것이다.

확실히 말할 수는 없지만, 대부분 역사적인 것 같아.꽤 많은 초기 C 컴파일러들은 부동 소수점을 전혀 지지하지 않았다.나중에 추가되었고, 그 후에도 완전히 -- 대부분 데이터 유형이 추가되었고, 언어에서 가장 원시적인 작업이 지원되었지만, 다른 모든 것들은 표준 라이브러리에 맡겨졌다.

"모듈로 산술의 수학적 개념은 부동 소수점 값에도 작용하며, 이는 도널드 크누스가 고전인 <컴퓨터 프로그래밍의 예술>(제1권)에서 논하는 첫 번째 이슈 중 하나이다.즉, 한때는 기본적인 지식이었다."

부동소수점계 연산자는 다음과 같이 정의된다.

m = num - iquot*den ; where iquot = int( num/den )

표시된 것처럼 부동 소수점 번호에 대한 % 연산자의 no-op은 표준과 관련된 것으로 보인다.CRTL은 FP 번호에 대해 %를 수행하기 위해 'fmod'와 일반적으로 'remainder'도 제공한다.이 둘의 차이는 중간 '아이쿼트' 라운딩을 어떻게 처리하느냐에 있다.

'fmod'는 둥글게 돌려서 쓰고, 'fmod'는 단순한 잘게를 쓴다.

C++ 숫자 클래스를 직접 작성하면 오버로드된 연산자 %를 포함하여 작업 불가 레거시를 수정하는 데 방해가 되는 것은 없다.

안부 전합니다

모듈로 연산자%C와 C++는 두 정수에 대해 정의되지만, 더블과 함께 사용할 수 있는 기능이 있다.

제약조건은 다음과 같다.

C11(ISO/IEC 9899:201x) §6.5.5 곱셈 연산자

각 피연산자는 산술 형식을 가져야 한다.% 연산자의 피연산자는 정수 형식을 가져야 한다.

C++11(ISO/IEC 14882:2011) §5.6 곱셈 연산자

*와 /의 피연산자는 산술 또는 열거형이어야 하며, %의 피연산자는 적분 또는 열거형이어야 한다.피연산자에 대해 일반적인 산술 변환을 수행하고 결과의 유형을 결정한다.

해결책은 사용하는 것이다.fmod, 그래서 정확히 피연산자의%C99 근거 §6.5.5 곱셈 연산자에 따르면, 우선 정수 타입으로 제한된다.

C89 위원회는 % 운영자를 부동액에 대한 작업으로 확장하는 것은 fmod에 의해 제공된 설비를 복제할 수 있기 때문에 거부하였다.

% 연산자는 숫자의 나머지(계수에 대한 다른 이름)를 제공한다.C/C++의 경우 이는 정수 연산에 대해서만 정의된다.Python은 조금 더 넓으며, 당신이 나머지 부동소수 번호의 나머지를 얻을 수 있도록 해준다.

>>> 4 % math.pi
0.85840734641020688
>>> 4 - math.pi
0.85840734641020688
>>> 

%++에서 C++의 두 중할때에서 .Float또는Double.

따라서 당신은 이 제품을 사용해 볼 수 있다.fmod로부터 기능하다.math.h/cmath.h또는 다음 코드 줄을 사용하여 해당 헤더 파일을 사용하지 마십시오.

float sin(float x) {
 float temp;
 temp = (x + M_PI) / ((2 *M_PI) - M_PI);
 return limited_sin((x + M_PI) - ((2 *M_PI) - M_PI) * temp ));

}

해보다fmod

참조URL: https://stackoverflow.com/questions/6102948/why-does-modulus-division-only-work-with-integers

반응형