現在の位置: ホーム> 最新記事一覧> BINDEC関数を使用するときの変換中の精度損失を回避する方法は?

BINDEC関数を使用するときの変換中の精度損失を回避する方法は?

gitbox 2025-09-17
<span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-comment">// この部分は、記事の内容とは何の関係もありません,テストコードまたはプレースホルダーコンテンツを配置できます</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"この記事を読んでください\n"</span></span><span>;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"------------------\n"</span></span><span>;
</span><span><span class="hljs-meta">?&gt;</span></span><span>

---

</span><span><span class="hljs-comment"># 使用 bindec 関数時間,変換真ん中の精度の損失を避ける方法?</span></span><span>

存在する PHP 真ん中,`bindec` 関数は、バイナリ文字列を10進数に変換できます。例えば:

```php
</span><span><span class="hljs-variable">$binary</span></span><span> = </span><span><span class="hljs-string">"1101"</span></span><span>;
</span><span><span class="hljs-variable">$decimal</span></span><span> = </span><span><span class="hljs-title function_ invoke__">bindec</span></span><span>(</span><span><span class="hljs-variable">$binary</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$decimal</span></span><span>; </span><span><span class="hljs-comment">// 出力 13</span></span><span>
</span></span>

Bindecは短いバイナリ番号を扱うときに非常に便利ですが、より大きなバイナリ数を処理する際に精密損失の問題が発生する可能性があります。これは、PHPの整数タイプとフローティングポイントタイプのサイズの制限が内部に保存されているためです。通常、64ビットシステムでのPHP整数の最大値は9223372036854775807です。この範囲を超えると、自動的に浮動小数点数に変換され、精度が低下します。

精度の損失を回避する方法

1. GMP拡張機能を使用します

GMP(GNU多重精度)は、任意の長さのバイナリ文字列を安全に処理できる高精度の整数計算を提供します。

 <span><span><span class="hljs-variable">$binary</span></span><span> = </span><span><span class="hljs-string">"110110101010101010101010101010101010"</span></span><span>;
</span><span><span class="hljs-variable">$decimal</span></span><span> = </span><span><span class="hljs-title function_ invoke__">gmp_init</span></span><span>(</span><span><span class="hljs-variable">$binary</span></span><span>, </span><span><span class="hljs-number">2</span></span><span>); </span><span><span class="hljs-comment">// バイナリをに変換します GMP 物体</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">gmp_strval</span></span><span>(</span><span><span class="hljs-variable">$decimal</span></span><span>);       </span><span><span class="hljs-comment">// 出力十进制字符串</span></span><span>
</span></span>

このようにして、バイナリ数が非常に大きい場合でも、精度は失われません。

2。BCMATH拡張機能を使用します

BCMATHは、高精度の文字列数値計算を提供します。これは、大きなバイナリ番号を処理するためにも使用できます。

 <span><span><span class="hljs-variable">$binary</span></span><span> = </span><span><span class="hljs-string">"110110101010101010101010101010101010"</span></span><span>;

</span><span><span class="hljs-variable">$decimal</span></span><span> = </span><span><span class="hljs-string">'0'</span></span><span>;
</span><span><span class="hljs-variable">$length</span></span><span> = </span><span><span class="hljs-title function_ invoke__">strlen</span></span><span>(</span><span><span class="hljs-variable">$binary</span></span><span>);

</span><span><span class="hljs-keyword">for</span></span><span> (</span><span><span class="hljs-variable">$i</span></span><span> = </span><span><span class="hljs-number">0</span></span><span>; </span><span><span class="hljs-variable">$i</span></span><span> &lt; </span><span><span class="hljs-variable">$length</span></span><span>; </span><span><span class="hljs-variable">$i</span></span><span>++) {
    </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$binary</span></span><span>[</span><span><span class="hljs-variable">$i</span></span><span>] === </span><span><span class="hljs-string">'1'</span></span><span>) {
        </span><span><span class="hljs-variable">$decimal</span></span><span> = </span><span><span class="hljs-title function_ invoke__">bcadd</span></span><span>(</span><span><span class="hljs-variable">$decimal</span></span><span>, </span><span><span class="hljs-title function_ invoke__">bcpow</span></span><span>(</span><span><span class="hljs-string">'2'</span></span><span>, (</span><span><span class="hljs-keyword">string</span></span><span>)(</span><span><span class="hljs-variable">$length</span></span><span> - </span><span><span class="hljs-variable">$i</span></span><span> - </span><span><span class="hljs-number">1</span></span><span>)));
    }
}

</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$decimal</span></span><span>; </span><span><span class="hljs-comment">// 出力十进制字符串</span></span><span>
</span></span>

BCMATHはGMPほど直接的ではありませんが、GMP拡張機能なしでも使用できます。

3。概要

  • 小さなバイナリ番号の場合、 Bindecを直接使用するだけで十分です。

  • 大きなバイナリ番号または高精度計算の場合、GMPまたはBCMATH拡張機能を使用することをお勧めします。

  • 浮遊点数に依存して大型整数を保存して、精度の損失を防ぐのを避けてください。

上記の方法を使用すると、タイプの制限のために精度の問題を回避しながら、PHPのバイナリ文字列を10進数に安全に変換できます。

<?php //この部分は、記事の内容とは何の関係もありません。いくつかのプレースホルダーを置くか、「記事の「\ nend」」を締めくくることができます。 ?>
 <span></span>