Carry를 통해 가치 전파를 만들 수 없습니다
최근 C에서 대규모 정밀 mpfl 클래스를 생성하려는 시도에서 개발자는 다음과 같은 문제를 만났습니다. 0xffffffff 및 0x04를 추가하면 예상한 결과 대신 0xffff0003이 발생하는 문제 0x0100000003. 작업을 담당하는 추가 함수는 아래에 설명되어 있습니다.
mpfl operator+(const mpfl &lhs, const mpfl &rhs) { unsigned long i; mpfl ret(0); mpfl trhs(rhs); for (i = lhs.nbytes; i >= 0; i--) { if ( (unsigned short)lhs.data[i].data + (unsigned short)trhs.data[i].data > (unsigned short)255 ) { if (i > 0) { ret.data[i].carry = 1; ret.data[0].carry = 0; } else { ret.data[0].carry = 1; } } else ret.data[i].carry = 0; ret.data[i].data = lhs.data[i].data + trhs.data[i].data; if (i < lhs.nbytes) { if (ret.data[i].data == 255 && ret.data[i + 1].carry == 1) increment(&trhs, i + 1); ret.data[i].data += ret.data[i + 1].carry; } if (i == 0) break; } return ret; }
이 함수의 목표는 두 개의 큰 정밀도 값을 추가하는 것이지만 캐리 전파를 올바르게 처리하지 못하여 부정확한 결과를 초래합니다. 이 문제를 해결하려면 다음 제안 사항을 고려하십시오.
또한 어셈블리 없이 큰 정밀도의 곱셈과 나눗셈 연산을 수행하려면 순수 C/C 구현에 대한 다음 링크를 참조하세요. :
[Float를 사용하지 않고 C에서 로그 함수 만들기 유형](https://stackoverflow.com/questions/11762232/building-a-logarithm-function-in-c-without-using-float-type)
위 내용은 이 C 큰 정밀도 덧셈 함수가 캐리를 올바르게 전파하지 못하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!