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 | 	else | ||||||
| 		m_value = bigint(_literal.value()); | 		m_value = bigint(_literal.value()); | ||||||
| 
 |  | ||||||
| 	switch (_literal.subDenomination()) | 	switch (_literal.subDenomination()) | ||||||
| 	{ | 	{ | ||||||
| 	case Literal::SubDenomination::None: | 	case Literal::SubDenomination::None: | ||||||
| @ -564,8 +563,6 @@ bool ConstantNumberType::isImplicitlyConvertibleTo(Type const& _convertTo) const | |||||||
| 		if (m_value == 0) | 		if (m_value == 0) | ||||||
| 			return true; | 			return true; | ||||||
| 		int forSignBit = (targetType->isSigned() ? 1 : 0); | 		int forSignBit = (targetType->isSigned() ? 1 : 0); | ||||||
| 		if (m_scalingFactor == 0) //if current type is integer
 |  | ||||||
| 		{ |  | ||||||
| 		if (m_value > 0) | 		if (m_value > 0) | ||||||
| 		{ | 		{ | ||||||
| 			if (m_value <= (u256(-1) >> (256 - targetType->numBits() + forSignBit))) | 			if (m_value <= (u256(-1) >> (256 - targetType->numBits() + forSignBit))) | ||||||
| @ -575,53 +572,28 @@ bool ConstantNumberType::isImplicitlyConvertibleTo(Type const& _convertTo) const | |||||||
| 			return true; | 			return true; | ||||||
| 		return false; | 		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) | 	else if (_convertTo.category() == Category::FixedPoint) | ||||||
| 	{ | 	{ | ||||||
| 		auto targetType = dynamic_cast<FixedPointType const*>(&_convertTo); | 		auto targetType = dynamic_cast<FixedPointType const*>(&_convertTo); | ||||||
| 		if (m_value == 0) | 		if (m_value == 0) | ||||||
| 			return true; | 			return true; | ||||||
| 		int forSignBit = (targetType->isSigned() ? 1 : 0); | 		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 (m_value > 0) | ||||||
| 		{ | 		{ | ||||||
| 			if ( | 			if ( | ||||||
| 					leftOfRadix() <= (u256(-1) >> (256 - targetType->integerBits() + forSignBit)) && | 				m_value <= (u256(-1) >> (256 - targetType->numBits() + forSignBit)) && | ||||||
| 					rightOfRadix() <= (u256(-1) >> (256 - targetType->fractionalBits() + forSignBit)) | 			 	m_scalingFactor <= targetType->fractionalBits() | ||||||
| 			) | 			) | ||||||
| 				return true; | 				return true; | ||||||
| 			} |  | ||||||
| 			else if ( | 			else if ( | ||||||
| 				targetType->isSigned() && | 				targetType->isSigned() && | ||||||
| 				-leftOfRadix() <= (u256(1) >> (256 - targetType->integerBits() + forSignBit)) && | 				-m_value <= (u256(1) >> (256 - targetType->numBits() + forSignBit)) && | ||||||
| 				-rightOfRadix() <= (u256(1) >> (256 - targetType->fractionalBits() + forSignBit)) | 				m_scalingFactor <= targetType->fractionalBits() | ||||||
| 			) | 			) | ||||||
| 				return true; | 				return true; | ||||||
| 			return false; | 			return false; | ||||||
| 		} | 		} | ||||||
|  | 
 | ||||||
| 	} | 	} | ||||||
| 	else if (_convertTo.category() == Category::FixedPoint) | 	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(); | 			value = m_value.numerator() & other.m_value.numerator(); | ||||||
| 			break; | 			break; | ||||||
| 		case Token::Add: | 		case Token::Add: | ||||||
| 			value = leftOfRadix() + other.leftOfRadix(); | 			value = m_value + other.m_value; | ||||||
| 			value *= boost::multiprecision::pow(bigint(10), scale); |  | ||||||
| 			value += rightOfRadix() + other.rightOfRadix();; |  | ||||||
| 			break; | 			break; | ||||||
| 		case Token::Sub: | 		case Token::Sub: | ||||||
| 			value = leftOfRadix() - other.leftOfRadix(); | 			value = m_value - other.m_value; | ||||||
| 			if (rightOfRadix() < other.rightOfRadix()) |  | ||||||
| 				scale = other.m_scalingFactor; |  | ||||||
| 			value *= boost::multiprecision::pow(bigint(10), scale); |  | ||||||
| 			value += (rightOfRadix() - other.rightOfRadix()); |  | ||||||
| 			break; | 			break; | ||||||
| 		//these next 4 need to be scaled accordingly if it's a fixed type
 |  | ||||||
| 		case Token::Mul: | 		case Token::Mul: | ||||||
| 			scale = m_scalingFactor - other.m_scalingFactor; | 			scale = m_scalingFactor - other.m_scalingFactor; | ||||||
| 			value = m_value * other.m_value; | 			value = m_value * other.m_value; | ||||||
| @ -761,7 +726,6 @@ TypePointer ConstantNumberType::binaryOperatorResult(Token::Value _operator, Typ | |||||||
| 				value = m_value / other.m_value; | 				value = m_value / other.m_value; | ||||||
| 			break; | 			break; | ||||||
| 		case Token::Mod: | 		case Token::Mod: | ||||||
| 		{ |  | ||||||
| 			if (other.m_value == 0) | 			if (other.m_value == 0) | ||||||
| 				return TypePointer(); | 				return TypePointer(); | ||||||
| 			else if (fixedPointType) | 			else if (fixedPointType) | ||||||
| @ -815,7 +779,6 @@ string ConstantNumberType::toString(bool) const | |||||||
| { | { | ||||||
| 	if (m_value.denominator() == 1) | 	if (m_value.denominator() == 1) | ||||||
| 		return "int_const " + m_value.numerator().str(); | 		return "int_const " + m_value.numerator().str(); | ||||||
| 
 |  | ||||||
| 	return "rational_const " + m_value.numerator().str() + '/' + m_value.denominator().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; | 				fixed c = 1.0 / 3.0; | ||||||
| 				ufixed d = 599 + .5367; | 				ufixed d = 599 + .5367; | ||||||
| 				ufixed e = 35.245 % 12.9; | 				ufixed e = 35.245 % 12.9; | ||||||
| 				ufixed g = 1.2 % 2.00000; | 				ufixed f = 1.2 % 2.00000; | ||||||
| 				//ufixed f = 2.222 ** 3.333;
 | 				//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_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) | BOOST_AUTO_TEST_CASE(inline_array_fixed_literals) | ||||||
| { | { | ||||||
| 	char const* text = R"( | 	char const* text = R"( | ||||||
| @ -3657,6 +3671,20 @@ BOOST_AUTO_TEST_CASE(size_capabilities_of_fixed_point_types) | |||||||
| 	BOOST_CHECK(success(text)); | 	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() | BOOST_AUTO_TEST_SUITE_END() | ||||||
| 
 | 
 | ||||||
| } | } | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user