[英]How to check if quotient is an integer? C++
我是一個初學者,我正在尋找一種方法來檢查C ++中的商是否為整數。
例如:
int a;
double b;
cin >> a;
b = a / 4;
我怎么知道b不是整數(類似於5/4 = 1.25)?
您無需檢查b
是否為整數,因為它始終是整數。 您將其聲明為int
。
此外,由於a
和4
都是整數,所以a/4
是整數除法,因此即使表達式也永遠不能是分數。
如果解決了所有這些問題,查看浮點值是否代表整數的一種方法是將其原始值與一個故意截斷為整數的值進行比較:
foobar == static_cast<int>(foobar)
但是,與任何浮點運算一樣,這很可能會產生舍入錯誤,因此您將需要更加具體地滿足一般要求。
在所示的特定情況下,取模取余會簡單得多: 5 % 4
不是零,所以5/4
不是整數。
在像C這樣的語言中,當聲明一個整數類型的變量時,其中的值始終是整數。 但是我猜您在問的是,如何檢查計算結果是否為整數值。 如果您要對整數類型進行算術運算,最天真地了解這樣做的方法是執行逆運算並測試結果是否與原始輸入匹配。
編輯如果兩個操作數都是整數類型(與問題編輯之前一樣),則可以執行以下操作:
b = a / 4;
if( b*4 == a ){
cout << "a/4 is integer";
}
但是,還有其他方法可以做到這一點。 例如,使用余數運算符%
(通常與取模運算符混淆-或更確切地說是誤稱)。 在許多CPU架構上,執行除法運算也會得到余數。 這個
b = a / 4;
if( b%4 == 0 ){
cout << "a/4 is integer";
}
它將接近最佳,因為一條CPU指令將執行兩個計算(在前兩行中),並且如果沒有剩余余數,則比較通常會測試除法運算設置的特殊標志。
*但是,如果浮點算術輸入圖像(問題編輯后如何進行),事情就會變得有些麻煩。 您不再可以進行反轉測試,因為浮點運算不精確¹。
如果您只對余數/模感興趣,那么最好的選擇是使用fmod
函數,然后測試結果是否在精度誤差epsilon的范圍內。
if( DBL_EPSILON > fmod(a, 4) ){
cout << "a/4 is integer (within double floating point precision)";
}
如果您同時需要商和余數,那么我的首選方法是截斷並減去(通常更快):
double b = a/4.;
double b_r = b - trunc(b);
if( DBL_EPSILON > fabs(b_r) ){
cout << "a/4 is integer (within double floating point precision)";
}
1:涉及的大多數數字; 有一組數字,在浮點算術運算中使用時,它們會產生精確的結果。 但這只是浮點可表示的所有數字的一小部分。
正如其他答案所建議的那樣,如果將除法分配給浮點數,則將始終獲得整數值,因為在C ++(和大多數語言)中,整數除法會生成整數。
實際上,您甚至不需要b就是float
。 您可以執行以下操作之一:
int a;
std::cin >> a;
if (a % 4 == 0) { /* do something */ }
int a;
std::cin >> a;
if (a & 0x11 == 0) { /* do something */ }
如果整數的最低有效2位為0,則該整數可以被4整除。但是,實際上,編譯器可能會將先前的測試優化為該整數。
如果您仍然打算使用a / 4,請嘗試:
int a;
std::cin >> a;
auto b = a / 4; /* b is an int... */
if (b * 4 == a) { /* do something */ }
對於固定除數的情況,這不是很有用; 但是,如果尚未修復,則可以執行以下操作:
int a;
std::cin >> a;
std::cin >> c;
auto b = a / c;
if (b * c == a) { /* do something */ }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.