You are viewing a plain text version of this content. The canonical link for it is here.
Posted to jdo-dev@db.apache.org by "Erik Bengtson (JIRA)" <ji...@apache.org> on 2005/12/11 23:10:09 UTC

[jira] Commented: (JDO-206) JDOQL test NotEquals comparing floating point numbers

    [ http://issues.apache.org/jira/browse/JDO-206?page=comments#action_12360161 ] 

Erik Bengtson commented on JDO-206:
-----------------------------------

Somehow derby is not storing correct the value.  I found that derby stores (float)-234.23 as -234.22999572753906

Here is the stacktrace that points the place with the bug.

Thread [main] (Suspended)
	Double.isNaN(double) line: 494
	NumberDataType.normalizeDOUBLE(double) line: not available
	SQLDouble.setValue(float) line: not available
	EmbedPreparedStatement30(EmbedPreparedStatement).setFloat(int, float) line: not available
	NewProxyPreparedStatement.setFloat(int, float) line: 729
	FloatRDBMSMapping.setFloat(Object, int, float) line: 90
	FloatMapping(SingleFieldMapping).setFloat(PersistenceManager, Object, int[], float) line: 245
	ParameterSetter.storeFloatField(int, float) line: 94
	StateManagerImpl.providedFloatField(PersistenceCapable, int, float) line: 2420
	AllTypes.jdoProvideField(int) line: not available
	AllTypes.jdoProvideFields(int[]) line: not available
	StateManagerImpl.provideFields(int[], FieldManager) line: 2827
	UpdateRequest.execute(StateManager) line: 224
	ClassTable.update(StateManager, FieldMetaData[]) line: 2118
	RDBMSManager(StoreManager).update(StateManager, int[]) line: 780
	StateManagerImpl.flush() line: 4401
	PersistenceManagerImpl(AbstractPersistenceManager).flush() line: 3044
	NonmanagedTransaction.getConnection(boolean, boolean, boolean) line: 220
	NonmanagedTransaction.getConnection(boolean, boolean) line: 189
	PersistenceManagerImpl(AbstractPersistenceManager).getConnection(boolean, boolean) line: 321
	InsertRequest.execute(StateManager) line: 168
	ClassTable.insert(StateManager) line: 2058
	RDBMSManager(StoreManager).insert(StateManager) line: 733
	StateManagerImpl.internalMakePersistent() line: 3261
	StateManagerImpl.makePersistent() line: 3234
	PersistenceManagerImpl(AbstractPersistenceManager).internalMakePersistent(Object, FieldValues) line: 1061
	PersistenceManagerImpl(AbstractPersistenceManager).makePersistent(Object) line: 1112
	AllTypes.load(PersistenceManager) line: 269
	NotEquals(ComparisonTests).verifyDataLoaded(PersistenceManager) line: 91
	NotEquals.test() line: 184
	NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method]
	NativeMethodAccessorImpl.invoke(Object, Object[]) line: 39
	DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 25
	Method.invoke(Object, Object...) line: 585
	NotEquals(TestCase).runTest() line: 154
	NotEquals(JDO_Test).runBare() line: 204
	TestResult$1.protect() line: 106
	TestResult.runProtected(Test, Protectable) line: 124
	TestResult.run(TestCase) line: 109
	NotEquals(TestCase).run(TestResult) line: 118
	TestSuite.runTest(Test, TestResult) line: 208
	TestSuite.run(TestResult) line: 203
	BatchTestRunner(TestRunner).doRun(Test, boolean) line: 116
	BatchTestRunner(TestRunner).doRun(Test) line: 109
	BatchTestRunner.run(Test) line: 80
	BatchTestRunner.run(Class) line: 75
	NotEquals.main(String[]) line: 177


This is the code that reproduces the issue with derby

import org.apache.derby.iapi.error.StandardException;
import org.apache.derby.iapi.types.NumberDataType;

public class FloatTest
{

    /**
     * @param args
     */
    public static void main(String[] args)
    {
        try
        {
            System.out.println(NumberDataType.normalizeDOUBLE((float)-234.23));
        }
        catch (StandardException e)
        {
            e.printStackTrace();
        }
    }

}


> JDOQL test NotEquals comparing floating point numbers
> -----------------------------------------------------
>
>          Key: JDO-206
>          URL: http://issues.apache.org/jira/browse/JDO-206
>      Project: JDO
>         Type: Bug
>   Components: tck20
>     Reporter: Andy Jefferson
>     Assignee: Erik Bengtson

>
> The current TCK test (carried over from JDO 1.0) for NotEquals, uses != operator on floating point numbers. This is not a good practice, and is unreliable. Its probably the case that the Equals test uses == on the same content, which also is not a good idea (as noted in the latest spec). These tests need reviewing and a reliable alternate strategy adopting

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira