BC开方(乙)


function bcroot($幂, $指 = '3', $scale = 0){
	#开方
	$d = false;
	if($幂 == '0'){
		return '0';
	}elseif($幂 == '1'){
		return '1';
	}

	$指数 = intval($指);
	$底扩位数 = $scale;
	$幂扩位数 = $指数 * $底扩位数;

	$幂 = bcmul($幂,str_pad('1',$幂扩位数+1,'0'));

	$小数点位 = strpos($幂,'.');
	if($小数点位 !== FALSE){
		$幂 = substr($幂,0,$小数点位);
	}

	$幂长 = strlen($幂);
	$底数长 = ceil($幂长 / $指数);

	#初次逆序
	$幂 = strrev($幂);
	$幂段 = array_reverse(str_split($幂,$指数));
	$底数 = '';
	$小余 = '0';
	foreach($幂段 as $小幂){
		#再次逆序,则正过来
		$小幂 = strrev($小幂);

		# (底 . 小底)^指数  - 小底^指数 <= 小余 . 小幂

		if($小余 != '0'){
			$此幂 = $小余.$小幂;
		}else{
			$此幂 = $小幂;
		}

		$小余 = '0';

		$小底 = '1';
		${'试幂'.$小底} = bcpow_sub($底数,$小底,$指);
		$比较 = bccomp(${'试幂'.$小底},$此幂);
		if($比较 == '1'){
			# x<1
			$小底 = '0';
			$小余 = $此幂;
		}else{
			# 1

 

转载于:https://my.oschina.net/u/2356887/blog/2252710

你可能感兴趣的:(BC开方(乙))