changed algorithm for finding bits

This commit is contained in:
VoR0220 2016-04-11 18:12:11 -05:00
parent 4b3e1f140c
commit 5bddb2d6ff

View File

@ -572,6 +572,7 @@ bool RationalNumberType::isImplicitlyConvertibleTo(Type const& _convertTo) const
} }
else if (_convertTo.category() == Category::FixedPoint) else if (_convertTo.category() == Category::FixedPoint)
{ {
cout << "hit here?" << endl;
if (fixedPointType() && fixedPointType()->isImplicitlyConvertibleTo(_convertTo)) if (fixedPointType() && fixedPointType()->isImplicitlyConvertibleTo(_convertTo))
return true; return true;
return false; return false;
@ -803,41 +804,48 @@ shared_ptr<IntegerType const> RationalNumberType::integerType() const
shared_ptr<FixedPointType const> RationalNumberType::fixedPointType() const shared_ptr<FixedPointType const> RationalNumberType::fixedPointType() const
{ {
//do calculations up here
bigint integers = wholeNumbers();
bigint shiftedValue;
unsigned integerBits = 0;
unsigned fractionalBits = 0;
bool fractionalSignBit = integers == 0; //sign the fractional side or the integer side
bool negative = (m_value < 0); bool negative = (m_value < 0);
unsigned fractionalBits = 0;
if (negative && !fractionalSignBit) // convert to positive number of same bit requirements unsigned integerBits = bytesRequired(wholeNumbers()) * 8;
{ rational value = m_value;
integers = ((0 - integers) - 1) << 1; bigint l = bigint(1) << 256;
integerBits = max(bytesRequired(integers), 1u) * 8; rational maxValue = rational(l);
tie(shiftedValue, fractionalBits) = findFractionNumberAndBits(integerBits); if (!negative)
} maxValue -= 1;
else if (negative && fractionalSignBit)
tie(shiftedValue, fractionalBits) = findFractionNumberAndBits();
else else
value = -value;
cout << "Max value: " << maxValue << endl;
while (value * 0x100 <= maxValue && value.denominator() != 1 && fractionalBits < 256 - integerBits)
{ {
if (!fractionalSignBit) value *= 0x100;
integerBits = max(bytesRequired(integers), 1u) * 8; fractionalBits += 8;
tie(shiftedValue, fractionalBits) = findFractionNumberAndBits(integerBits);
if (shiftedValue == 0 && fractionalSignBit)
{
integerBits = 8;
fractionalBits = 8;
}
} }
if (shiftedValue > u256(-1) || integers > u256(-1)) if (value > maxValue)
{
cout << "value > max value " << endl;
return shared_ptr<FixedPointType const>(); return shared_ptr<FixedPointType const>();
else }
return make_shared<FixedPointType>( bigint v = value.denominator() / value.numerator();
integerBits, fractionalBits, if (negative)
negative ? FixedPointType::Modifier::Signed : FixedPointType::Modifier::Unsigned v = -v;
); // u256(v) is the actual value that will be put on the stack
// From here on, very similar to integerType()
//if (negative) // convert to positive number of same bit requirements
// value = ((0 - value) - 1) << 1;
if (value > u256(-1))
{
cout << "Too large of a number" << endl;
return shared_ptr<FixedPointType const>();
}
cout << "integer bits: " << integerBits << ", fractionalBits: " << fractionalBits << endl;
//solAssert(integerBits >= fractionalBits, "Invalid bit requirement calculation.");
//@todo special handling for integerBits == 0 && fractionalBits == 0?
return make_shared<FixedPointType>(
integerBits, fractionalBits,
negative ? FixedPointType::Modifier::Signed : FixedPointType::Modifier::Unsigned
);
} }
//todo: change name of function //todo: change name of function