mirror of
				https://github.com/ethereum/solidity
				synced 2023-10-03 13:03:40 +00:00 
			
		
		
		
	Rational implemented...trying to figure out exponential
This commit is contained in:
		
							parent
							
								
									9a075458ad
								
							
						
					
					
						commit
						6fa5e0fac9
					
				| @ -521,7 +521,6 @@ ConstantNumberType::ConstantNumberType(Literal const& _literal) | ||||
| 	} | ||||
| 	else | ||||
| 		m_value = bigint(_literal.value()); | ||||
| 
 | ||||
| 	switch (_literal.subDenomination()) | ||||
| 	{ | ||||
| 	case Literal::SubDenomination::None: | ||||
| @ -564,8 +563,6 @@ bool ConstantNumberType::isImplicitlyConvertibleTo(Type const& _convertTo) const | ||||
| 		if (m_value == 0) | ||||
| 			return true; | ||||
| 		int forSignBit = (targetType->isSigned() ? 1 : 0); | ||||
| 		if (m_scalingFactor == 0) //if current type is integer
 | ||||
| 		{ | ||||
| 		if (m_value > 0) | ||||
| 		{ | ||||
| 			if (m_value <= (u256(-1) >> (256 - targetType->numBits() + forSignBit))) | ||||
| @ -575,53 +572,28 @@ bool ConstantNumberType::isImplicitlyConvertibleTo(Type const& _convertTo) const | ||||
| 			return true; | ||||
| 		return false; | ||||
| 	} | ||||
| 		else if (m_scalingFactor != 0) //if current type is fixed point
 | ||||
| 		{ | ||||
| 			if (m_value > 0) | ||||
| 			{ | ||||
| 				if (leftOfRadix() <= (u256(-1) >> (256 - targetType->numBits() + forSignBit))) | ||||
| 					return true; | ||||
| 			} | ||||
| 			else if (targetType->isSigned() && -leftOfRadix() <= (u256(1) << (targetType->numBits() - forSignBit))) | ||||
| 				return true; | ||||
| 			return false; | ||||
| 		} | ||||
| 	} | ||||
| 	else if (_convertTo.category() == Category::FixedPoint) | ||||
| 	{ | ||||
| 		auto targetType = dynamic_cast<FixedPointType const*>(&_convertTo); | ||||
| 		if (m_value == 0) | ||||
| 			return true; | ||||
| 		int forSignBit = (targetType->isSigned() ? 1 : 0); | ||||
| 		if (m_scalingFactor == 0) //if the current type is an integer, focus on the integer bits
 | ||||
| 		{ | ||||
| 			if (m_value > 0) | ||||
| 			{ | ||||
| 				if (m_value <= (u256(-1) >> (256 - targetType->integerBits() + forSignBit))) | ||||
| 					return true; | ||||
| 			} | ||||
| 			else if (targetType->isSigned() && -m_value <= (u256(1) << (targetType->integerBits() - forSignBit))) | ||||
| 				return true; | ||||
| 			return false; | ||||
| 		} | ||||
| 		else if (m_scalingFactor != 0)	//if the current type is fixed point, focus on both the
 | ||||
| 		{						//integer bits and fractional bits and ensure they fit
 | ||||
| 		if (m_value > 0) | ||||
| 		{ | ||||
| 			if ( | ||||
| 					leftOfRadix() <= (u256(-1) >> (256 - targetType->integerBits() + forSignBit)) && | ||||
| 					rightOfRadix() <= (u256(-1) >> (256 - targetType->fractionalBits() + forSignBit)) | ||||
| 				m_value <= (u256(-1) >> (256 - targetType->numBits() + forSignBit)) && | ||||
| 			 	m_scalingFactor <= targetType->fractionalBits() | ||||
| 			) | ||||
| 				return true; | ||||
| 			} | ||||
| 			else if ( | ||||
| 				targetType->isSigned() && | ||||
| 				-leftOfRadix() <= (u256(1) >> (256 - targetType->integerBits() + forSignBit)) && | ||||
| 				-rightOfRadix() <= (u256(1) >> (256 - targetType->fractionalBits() + forSignBit)) | ||||
| 				-m_value <= (u256(1) >> (256 - targetType->numBits() + forSignBit)) && | ||||
| 				m_scalingFactor <= targetType->fractionalBits() | ||||
| 			) | ||||
| 				return true; | ||||
| 			return false; | ||||
| 		} | ||||
| 
 | ||||
| 	} | ||||
| 	else if (_convertTo.category() == Category::FixedPoint) | ||||
| 	{ | ||||
| @ -738,18 +710,11 @@ TypePointer ConstantNumberType::binaryOperatorResult(Token::Value _operator, Typ | ||||
| 			value = m_value.numerator() & other.m_value.numerator(); | ||||
| 			break; | ||||
| 		case Token::Add: | ||||
| 			value = leftOfRadix() + other.leftOfRadix(); | ||||
| 			value *= boost::multiprecision::pow(bigint(10), scale); | ||||
| 			value += rightOfRadix() + other.rightOfRadix();; | ||||
| 			value = m_value + other.m_value; | ||||
| 			break; | ||||
| 		case Token::Sub: | ||||
| 			value = leftOfRadix() - other.leftOfRadix(); | ||||
| 			if (rightOfRadix() < other.rightOfRadix()) | ||||
| 				scale = other.m_scalingFactor; | ||||
| 			value *= boost::multiprecision::pow(bigint(10), scale); | ||||
| 			value += (rightOfRadix() - other.rightOfRadix()); | ||||
| 			value = m_value - other.m_value; | ||||
| 			break; | ||||
| 		//these next 4 need to be scaled accordingly if it's a fixed type
 | ||||
| 		case Token::Mul: | ||||
| 			scale = m_scalingFactor - other.m_scalingFactor; | ||||
| 			value = m_value * other.m_value; | ||||
| @ -761,7 +726,6 @@ TypePointer ConstantNumberType::binaryOperatorResult(Token::Value _operator, Typ | ||||
| 				value = m_value / other.m_value; | ||||
| 			break; | ||||
| 		case Token::Mod: | ||||
| 		{ | ||||
| 			if (other.m_value == 0) | ||||
| 				return TypePointer(); | ||||
| 			else if (fixedPointType) | ||||
| @ -815,7 +779,6 @@ string ConstantNumberType::toString(bool) const | ||||
| { | ||||
| 	if (m_value.denominator() == 1) | ||||
| 		return "int_const " + m_value.numerator().str(); | ||||
| 
 | ||||
| 	return "rational_const " + m_value.numerator().str() + '/' + m_value.denominator().str(); | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -3598,8 +3598,9 @@ BOOST_AUTO_TEST_CASE(fixed_type_literal_expression) | ||||
| 				fixed c = 1.0 / 3.0; | ||||
| 				ufixed d = 599 + .5367; | ||||
| 				ufixed e = 35.245 % 12.9; | ||||
| 				ufixed g = 1.2 % 2.00000; | ||||
| 				//ufixed f = 2.222 ** 3.333;
 | ||||
| 				ufixed f = 1.2 % 2.00000; | ||||
| 				//fixed g = 2 ** -1.5;
 | ||||
| 				//fixed h = -3 ** -5.8;
 | ||||
| 			} | ||||
| 		} | ||||
| 	)"; | ||||
| @ -3631,6 +3632,19 @@ BOOST_AUTO_TEST_CASE(array_declaration_with_fixed_literal) | ||||
| 	BOOST_CHECK(!success(text)); | ||||
| } | ||||
| 
 | ||||
| BOOST_AUTO_TEST_CASE(mapping_with_fixed_literal) | ||||
| { | ||||
| 	char const* text = R"( | ||||
| 		contract test { | ||||
| 			mapping(fixed => string) fixedString; | ||||
| 			function f() { | ||||
| 				fixedString[3.14] = "Pi"; | ||||
| 			} | ||||
| 		} | ||||
| 	)"; | ||||
| 	BOOST_CHECK(success(text)); | ||||
| } | ||||
| 
 | ||||
| BOOST_AUTO_TEST_CASE(inline_array_fixed_literals) | ||||
| { | ||||
| 	char const* text = R"( | ||||
| @ -3657,6 +3671,20 @@ BOOST_AUTO_TEST_CASE(size_capabilities_of_fixed_point_types) | ||||
| 	BOOST_CHECK(success(text)); | ||||
| } | ||||
| 
 | ||||
| BOOST_AUTO_TEST_CASE(var_capable_of_holding_fixed_constants) | ||||
| { | ||||
| 	char const* text = R"( | ||||
| 		contract test { | ||||
| 			function f() { | ||||
| 				var a = 0.12345678; | ||||
| 				var b = 12345678.0; | ||||
| 				var c = 0.00000009; | ||||
| 			} | ||||
| 		} | ||||
| 	)"; | ||||
| 	BOOST_CHECK(success(text)); | ||||
| } | ||||
| 
 | ||||
| BOOST_AUTO_TEST_SUITE_END() | ||||
| 
 | ||||
| } | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user