FloatMathPlugin issues (was: [Vm-dev] Re: [squeak-dev] Re: [4.2] tests status)

David T. Lewis lewis at mail.msen.com
Wed Dec 29 18:49:38 UTC 2010


On Wed, Dec 29, 2010 at 07:13:25PM +0100, Nicolas Cellier wrote:
>  
> 2010/12/29 David T. Lewis <lewis at mail.msen.com>:
> >
> > I have found an additional issue with the FloatMath updates. When running
> > on a VM compiled for 64 bits, an updated trunk image hangs up with no input
> > event processing and no display updates.
> >
> > This is on a Linux VM compiled with no optimization (CFLAGS='-g -m64 -O0).
> >
> > The problem is related to Float>>fractionPart. If this method is reverted
> > to the prior version, or if the FloatMathPlugin is not present, the image
> > no longer hangs.
> >
> > The primitive in question is FloatMathPlugin>>primitiveFractionalPart which
> > presumably has a bug related to pointer size. The bug is exposed by compiling
> > with 64 bit pointers, and the updated trunk image will hang up if the primitive
> > is being called by Float>>fractionPart.
> >
> > The FloatMathPlugin>>primitiveFractionalPart method looks fine (variables
> > all declared correctly). The error occurs within the __ieee754_modf(rcvr, &trunc)
> > function call, which produces completely bogus results when compiled -m64.
> > This function is implemented as modf() in fdlibm. A stand-alone C test
> > program confirms that the bug is in the library function itself.
> >
> > Presumably this bug would affect Mac VMs compiled for 64-bits, and I think
> > there are a number of these in circulation (though I do not know if they
> > include the FloatMathPlugin).
> >
> > Dave
> 
> I fail to see how modf() could possibly be inexact, it just has to cut
> the mantissa in two parts...
> Therefore, primitive 52 should lead to bit identical results across platforms.
> The only thing to change in order to be FloatMathPlugin compatible
> would be to fail the primitive for a nan receiver.
> 
> The fdlibm do define a replacement __ieee754_modf() because it has to
> (it is a replacement of libm and cannot use default libm).
> Maybe we don't have to use it, and can safely revert to modf().
> 
> Nicolas

Judging by the results of FloatConsistencyTests>>testFractionStd,
primitive 52 does in fact produce different results from
FloatMathPlugin>>primitiveFractionalPart. Whether primitive 52
would be consistent across platforms I cannot say.

But more importantly, I'm afraid that the FloatMathPlugin is
completely broken when compiled for 64 bits. I reverted the
Float>>fractionPart method to use primitive 52 in order to be
able to run the image, then ran the full suite of KernelTests-Numbers
tests. The results are not encouraging:

====
29 December 2010 1:21:48 pm
Results of KernelTests-Numbers tests with 64-bit VM and FloatMathPlugin, no compiler optimization.
Float>>fractionPart is reverted to prior version to permit the image to run, so FloatConsistencyTests>>testFractionStd is an expected failure.
Test errors:
	FloatConsistencyTests>>#testAddArray
	FloatConsistencyTests>>#testArcCos
	FloatConsistencyTests>>#testArcCosH
	FloatConsistencyTests>>#testArcSin
	FloatConsistencyTests>>#testArcSinH
	FloatConsistencyTests>>#testArcTan
	FloatConsistencyTests>>#testArcTan2
	FloatConsistencyTests>>#testArcTanH
	FloatConsistencyTests>>#testCos
	FloatConsistencyTests>>#testCosH
	FloatConsistencyTests>>#testDivArray
	FloatConsistencyTests>>#testDot
	FloatConsistencyTests>>#testExp
	FloatConsistencyTests>>#testFloatAt
	FloatConsistencyTests>>#testFraction
	FloatConsistencyTests>>#testHypot
	FloatConsistencyTests>>#testLog
	FloatConsistencyTests>>#testLog10
	FloatConsistencyTests>>#testMulArray
	FloatConsistencyTests>>#testSin
	FloatConsistencyTests>>#testSinH
	FloatConsistencyTests>>#testSqrt
	FloatConsistencyTests>>#testSubArray
	FloatConsistencyTests>>#testTan
	FloatConsistencyTests>>#testTanH
	FloatConsistencyTests>>#testTimesTwoPower
	FloatTest>>#testFractionAsFloat
	LargePositiveIntegerTest>>#testReciprocalModulo
	RandomTest>>#testNext
	SqNumberParserTest>>#testFloatPrintString
Test failures:
	FloatConsistencyTests>>#testAddScalar
	FloatConsistencyTests>>#testArcCosHStd
	FloatConsistencyTests>>#testArcCosStd
	FloatConsistencyTests>>#testArcSinHStd
	FloatConsistencyTests>>#testArcSinStd
	FloatConsistencyTests>>#testArcTanHStd
	FloatConsistencyTests>>#testArcTanStd
	FloatConsistencyTests>>#testCosHStd
	FloatConsistencyTests>>#testCosStd
	FloatConsistencyTests>>#testDivScalar
	FloatConsistencyTests>>#testExpStd
	FloatConsistencyTests>>#testFractionStd
	FloatConsistencyTests>>#testLength
	FloatConsistencyTests>>#testMulScalar
	FloatConsistencyTests>>#testNormalize
	FloatConsistencyTests>>#testSinHStd
	FloatConsistencyTests>>#testSinStd
	FloatConsistencyTests>>#testSubScalar
	FloatConsistencyTests>>#testSum
	FloatConsistencyTests>>#testTanHStd
	FloatConsistencyTests>>#testTanStd
	FloatTest>>#testArcTan
	FloatTest>>#testCharacterization
	FloatTest>>#testComparison
	FloatTest>>#testDegreeCos
	FloatTest>>#testDegreeSin
	FloatTest>>#testDegreeSinForExceptionalValues
	FloatTest>>#testFloatRounded
	FloatTest>>#testFloatTruncated
	FloatTest>>#testFractionAsFloat2
	FloatTest>>#testInfinity1
	FloatTest>>#testInfinity2
	FloatTest>>#testIntegerAsFloat
	FloatTest>>#testNonSignalingNaN
	FloatTest>>#testSignalingNaN
	FloatTest>>#testStoreBase16
	FloatTest>>#testStoreOn
	FractionTest>>#testDegreeCos
	FractionTest>>#testDegreeSin
	FractionTest>>#testLn
	FractionTest>>#testLog
	IntegerTest>>#testDegreeCos
	IntegerTest>>#testDegreeSin
	IntegerTest>>#testLn
	IntegerTest>>#testLog
	IntegerTest>>#testSqrtFloor
	NumberParsingTest>>#testFloatFromStreamWithExponent
	NumberParsingTest>>#testFloatFromStringWithExponent
	NumberTest>>#testReadFrom
	SqNumberParserTest>>#testFloatFromStreamWithExponent
	SqNumberParserTest>>#testFloatGradualUnderflow
Tests passed:
	RandomTest>>#testClassComment
	RandomTest>>#testCoverage
	RandomTest>>#testNew
	RandomTest>>#testUnCategorizedMethods
	ExtendedNumberParserTest>>#testClassComment
	ExtendedNumberParserTest>>#testCoverage
	ExtendedNumberParserTest>>#testFractionPartWithoutIntegerPart
	ExtendedNumberParserTest>>#testIntegerPartWithoutFraction
	ExtendedNumberParserTest>>#testInvalidExponent
	ExtendedNumberParserTest>>#testInvalidRadix
	ExtendedNumberParserTest>>#testInvalidScale
	ExtendedNumberParserTest>>#testNew
	ExtendedNumberParserTest>>#testPositive
	ExtendedNumberParserTest>>#testPositiveExponent
	ExtendedNumberParserTest>>#testUnCategorizedMethods
	NumberTest>>#testClassComment
	NumberTest>>#testCoverage
	NumberTest>>#testFractionPart
	NumberTest>>#testIntegerPart
	NumberTest>>#testNew
	NumberTest>>#testOne
	NumberTest>>#testPrintShowingDecimalPlaces
	NumberTest>>#testPrintShowingDecimalPlaces2
	NumberTest>>#testPrintShowingDecimalPlaces3
	NumberTest>>#testRaisedTo
	NumberTest>>#testRaisedToInteger
	NumberTest>>#testRaisedToIntegerWithFloats
	NumberTest>>#testReciprocal
	NumberTest>>#testUnCategorizedMethods
	FloatConsistencyTests>>#testMD5
	LargePositiveIntegerTest>>#testBitShift
	LargePositiveIntegerTest>>#testClassComment
	LargePositiveIntegerTest>>#testCompactClassIndex
	LargePositiveIntegerTest>>#testCoverage
	LargePositiveIntegerTest>>#testDenormalizedPrintString
	LargePositiveIntegerTest>>#testEmptyTemplate
	LargePositiveIntegerTest>>#testMultDicAddSub
	LargePositiveIntegerTest>>#testNew
	LargePositiveIntegerTest>>#testNormalize
	LargePositiveIntegerTest>>#testUnCategorizedMethods
	LargeNegativeIntegerTest>>#testClassComment
	LargeNegativeIntegerTest>>#testCompactClassIndex
	LargeNegativeIntegerTest>>#testCoverage
	LargeNegativeIntegerTest>>#testDenormalizedPrintString
	LargeNegativeIntegerTest>>#testEmptyTemplate
	LargeNegativeIntegerTest>>#testNew
	LargeNegativeIntegerTest>>#testUnCategorizedMethods
	SmallIntegerTest>>#testBasicNew
	SmallIntegerTest>>#testClassComment
	SmallIntegerTest>>#testCoverage
	SmallIntegerTest>>#testDivide
	SmallIntegerTest>>#testEven
	SmallIntegerTest>>#testMaxVal
	SmallIntegerTest>>#testMinVal
	SmallIntegerTest>>#testNew
	SmallIntegerTest>>#testOdd
	SmallIntegerTest>>#testPrintPaddedWith
	SmallIntegerTest>>#testPrintString
	SmallIntegerTest>>#testUnCategorizedMethods
	IntegerDigitLogicTest>>#testAndSingleBitWithMinusOne
	IntegerDigitLogicTest>>#testLargeShift
	IntegerDigitLogicTest>>#testMixedSignDigitLogic
	IntegerDigitLogicTest>>#testNBitAndNNegatedEqualsN
	IntegerDigitLogicTest>>#testNNegatedEqualsNComplementedPlusOne
	IntegerDigitLogicTest>>#testShiftMinusOne1LeftThenRight
	IntegerDigitLogicTest>>#testShiftOneLeftThenRight
	IntegerTest>>#testBenchFib
	IntegerTest>>#testBitAt
	IntegerTest>>#testBitLogic
	IntegerTest>>#testCreationFromBytes1
	IntegerTest>>#testCreationFromBytes2
	IntegerTest>>#testCreationFromBytes3
	IntegerTest>>#testCrossSumBase
	IntegerTest>>#testDifferentBases
	IntegerTest>>#testEven
	IntegerTest>>#testHighBit
	IntegerTest>>#testHighBitOfMagnitude
	IntegerTest>>#testIntegerByteEncoded
	IntegerTest>>#testIntegerPadding
	IntegerTest>>#testIntegerReadFrom
	IntegerTest>>#testIsInteger
	IntegerTest>>#testIsPowerOfTwo
	IntegerTest>>#testIsPowerOfTwoM6873
	IntegerTest>>#testIsPrime
	IntegerTest>>#testIsProbablyPrime
	IntegerTest>>#testLargePrimesUpTo
	IntegerTest>>#testLowBit
	IntegerTest>>#testNegativeIntegerPrinting
	IntegerTest>>#testNew
	IntegerTest>>#testNumberOfDigits
	IntegerTest>>#testPositiveIntegerPrinting
	IntegerTest>>#testPrimesUpTo
	IntegerTest>>#testPrintOnBaseShowRadix
	IntegerTest>>#testPrintStringBase
	IntegerTest>>#testReadFrom
	IntegerTest>>#testReciprocalModulo
	IntegerTest>>#testRomanPrinting
	IntegerTest>>#testStringAsNumber
	IntegerTest>>#testTwoComplementBitLogicWithCarry
	IntegerTest>>#testTwoComplementRightShift
	SqNumberParserTest>>#testClassComment
	SqNumberParserTest>>#testCoverage
	SqNumberParserTest>>#testFail
	SqNumberParserTest>>#testFloatFromStreamAsNumber
	SqNumberParserTest>>#testFloatReadError
	SqNumberParserTest>>#testFloatReadWithRadix
	SqNumberParserTest>>#testIntegerReadFrom
	SqNumberParserTest>>#testIntegerReadWithRadix
	SqNumberParserTest>>#testNew
	SqNumberParserTest>>#testScaledDecimalWithTrailingZeroes
	SqNumberParserTest>>#testUnCategorizedMethods
	ScaledDecimalTest>>#testAsNumber
	ScaledDecimalTest>>#testAsNumberNegatedWithoutDecimalPoint
	ScaledDecimalTest>>#testAsNumberNegatedWithoutDecimalPoint2
	ScaledDecimalTest>>#testAsNumberWithExtendedScale
	ScaledDecimalTest>>#testAsNumberWithRadix
	ScaledDecimalTest>>#testAsNumberWithSuperfluousDecimalPoint
	ScaledDecimalTest>>#testAsNumberWithoutDecimalPoint
	ScaledDecimalTest>>#testAsNumberWithoutDecimalPoint2
	ScaledDecimalTest>>#testClassComment
	ScaledDecimalTest>>#testCoercion
	ScaledDecimalTest>>#testConvertFromFloat
	ScaledDecimalTest>>#testConvertFromFraction
	ScaledDecimalTest>>#testConvertFromFractionWithScale
	ScaledDecimalTest>>#testConvertFromInteger
	ScaledDecimalTest>>#testConvertFromIntegerWithScale
	ScaledDecimalTest>>#testCoverage
	ScaledDecimalTest>>#testIsLiteral
	ScaledDecimalTest>>#testLiteral
	ScaledDecimalTest>>#testNew
	ScaledDecimalTest>>#testOneRaisedToInteger
	ScaledDecimalTest>>#testPrintString
	ScaledDecimalTest>>#testRaisedToInteger
	ScaledDecimalTest>>#testReadFrom
	ScaledDecimalTest>>#testScaleExtension
	ScaledDecimalTest>>#testStoreOn
	ScaledDecimalTest>>#testUnCategorizedMethods
	ScaledDecimalTest>>#testZeroRaisedToInteger
	FractionTest>>#testClassComment
	FractionTest>>#testCoverage
	FractionTest>>#testFractionPrinting
	FractionTest>>#testNew
	FractionTest>>#testReciprocal
	FractionTest>>#testUnCategorizedMethods
	NumberParsingTest>>#testFloatFromStreamAsNumber
	NumberParsingTest>>#testFloatFromStringAsNumber
	NumberParsingTest>>#testFloatReadWithRadix
	NumberParsingTest>>#testIntegerFromString
	NumberParsingTest>>#testIntegerReadFrom
	NumberParsingTest>>#testIntegerReadWithRadix
	NumberParsingTest>>#testNegativeZero
	NumberParsingTest>>#testScaledDecimalWithTrailingZeroes
	FloatTest>>#test32bitGradualUnderflow
	FloatTest>>#test32bitRoundingMode
	FloatTest>>#testClassComment
	FloatTest>>#testCloseTo
	FloatTest>>#testComparisonWhenPrimitiveFails
	FloatTest>>#testContinuedFractions
	FloatTest>>#testCopy
	FloatTest>>#testCoverage
	FloatTest>>#testDegreeCosForExceptionalValues
	FloatTest>>#testDivide
	FloatTest>>#testHugeIntegerCloseTo
	FloatTest>>#testInfinity3
	FloatTest>>#testInfinityCloseTo
	FloatTest>>#testIsZero
	FloatTest>>#testNaN1
	FloatTest>>#testNaN2
	FloatTest>>#testNaN3
	FloatTest>>#testNaN4
	FloatTest>>#testNaN5
	FloatTest>>#testNaNCompare
	FloatTest>>#testNaNisLiteral
	FloatTest>>#testNegativeZeroAbs
	FloatTest>>#testNegativeZeroSign
	FloatTest>>#testNew
	FloatTest>>#testRaisedTo
	FloatTest>>#testReadFromManyDigits
	FloatTest>>#testReciprocal
	FloatTest>>#testSetOfFloat
	FloatTest>>#testSign
	FloatTest>>#testStringAsNumber
	FloatTest>>#testUnCategorizedMethods
	FloatTest>>#testZero1
	FloatTest>>#testZero2
	FloatTest>>#testZeroSignificandAsInteger

 


More information about the Vm-dev mailing list