ホームページ >バックエンド開発 >C++ >整数の除算で確実に上方丸めを行うにはどうすればよいでしょうか?

整数の除算で確実に上方丸めを行うにはどうすればよいでしょうか?

Susan Sarandon
Susan Sarandonオリジナル
2025-01-20 09:27:09632ブラウズ

How Can We Ensure Upward Rounding in Integer Division?

整数の除算を切り上げる信頼性の高い方法

整数演算は難しい場合があり、除算も例外ではありません。整数の除算のデフォルトの動作はゼロに向かって丸められますが、切り上げが望ましい状況もあります。この記事では、整数の除算で切り上げを実装する方法を検討し、既存のソリューションの欠点に対処し、堅牢な実装を提案します。

問題の説明

目標は、結果を常に切り上げる整数除算関数を実装することです。既存の方法では、倍精度浮動小数点数へのキャストと Math.Ceiling() の使用が必要ですが、浮動小数点演算が含まれるため、煩雑になる可能性があります。

解決策

整数演算は慎重に扱うことが重要です。望ましい動作を慎重に定義し、問題を管理可能なステップに分割することで、より洗練された効率的なソリューションを設計できます。

  1. 仕様:
  • 除数がゼロの場合、関数は例外をスローする必要があります。
  • 被除数が最小の整数値で、除数が -1 の場合も例外がスローされます。
  • 偶数除算の場合、結果は整数の商になります。
  • それ以外の場合、結果は商より大きい最小の整数になるはずです。
  1. デザイン:

この仕様を実装するには、整数の商を計算し、除算が偶数かどうかを判断し、切り上げか切り捨てかを決定する必要があります。

  1. コード:
<code class="language-java">public static int DivRoundUp(int dividend, int divisor) {
  if (divisor == 0) throw new ArithmeticException("除以零");
  if (divisor == -1 && dividend == Integer.MIN_VALUE) throw new ArithmeticException("溢出错误");

  int roundedQuotient = dividend / divisor;
  boolean dividedEvenly = (dividend % divisor) == 0;

  if (dividedEvenly) {
    return roundedQuotient;
  } else {
    boolean roundedDown = ((divisor > 0) == (dividend > 0));
    if (roundedDown) {
      return roundedQuotient + 1;
    } else {
      return roundedQuotient;
    }
  }
}</code>

このソリューションは仕様に準拠しており、比較的理解しやすいです。これにより、倍精度浮動小数点数へのキャストや複雑なエラー処理が回避され、効率的かつ堅牢になります。

以上が整数の除算で確実に上方丸めを行うにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。