// On windows sprintf outputs 3 digit precision exponent prepending
// zeros. Make it 2 digit precision if first digit is zero in the exponent.
#ifdef PEGASUS_OS_TYPE_WINDOWS
-void _normalizeRealValueString(char* str)
+void _normalizeRealValueString(char* str, Uint32& size)
{
// skip initial sign value...
if (*str == '-' || *str == '+')
*str = *(str+1);
*(str+1) = *(str+2);
*(str+2) = 0;
+ size--;
}
}
#endif
// (4 byte IEEE floating point)
size = sprintf(buffer, "%.7e", x);
#ifdef PEGASUS_OS_TYPE_WINDOWS
- _normalizeRealValueString(buffer);
+ _normalizeRealValueString(buffer, size);
#endif
return buffer;
}
// by the CIM 2.2 spec (8 byte IEEE floating point)
size = sprintf(buffer, "%.16e", x);
#ifdef PEGASUS_OS_TYPE_WINDOWS
- _normalizeRealValueString(buffer);
+ _normalizeRealValueString(buffer, size);
#endif
return buffer;
}
#include <Pegasus/Common/StringConversion.h>
#include <cstring>
#include <iostream>
+#include <math.h>
PEGASUS_USING_PEGASUS;
PEGASUS_USING_STD;
!StringConversion::stringToReal64("1.1e+123456789", r64));
}
+void testReal32ToString()
+{
+ Real32 r32;
+ Real64 r64r;
+ char buffer[128];
+ Uint32 size;
+ {
+ r32 = 1.5;
+ const char* result = Real32ToString(buffer, r32, size);
+ PEGASUS_TEST_ASSERT(strlen(result) == size);
+ PEGASUS_TEST_ASSERT(StringConversion::stringToReal64(result, r64r));
+ PEGASUS_TEST_ASSERT(fabs(r32 - r64r) < r32/1000);
+ }
+
+ {
+ r32 = 0;
+ const char* result = Real32ToString(buffer, r32, size);
+ PEGASUS_TEST_ASSERT(strlen(result) == size);
+ PEGASUS_TEST_ASSERT(StringConversion::stringToReal64(result, r64r));
+ PEGASUS_TEST_ASSERT(fabs(r32 - r64r) < .0001);
+ }
+
+ {
+ r32 = 10.0E-0001;
+ const char* result = Real32ToString(buffer, r32, size);
+ PEGASUS_TEST_ASSERT(strlen(result) == size);
+ PEGASUS_TEST_ASSERT(StringConversion::stringToReal64(result, r64r));
+ PEGASUS_TEST_ASSERT(fabs(r32 - r64r) < r32/1000);
+ }
+ {
+ r32 = 10.0E+5;
+ const char* result = Real32ToString(buffer, r32, size);
+ PEGASUS_TEST_ASSERT(strlen(result) == size);
+ PEGASUS_TEST_ASSERT(StringConversion::stringToReal64(result, r64r));
+ PEGASUS_TEST_ASSERT(fabs(r32 - r64r) < r32/1000);
+ }
+}
+
+void testReal64ToString()
+{
+ Real64 r64;
+ Real64 r64r;
+ char buffer[128];
+ Uint32 size;
+ {
+ r64 = 1.5;
+ const char* result = Real64ToString(buffer, r64, size);
+ PEGASUS_TEST_ASSERT(strlen(result) == size);
+ PEGASUS_TEST_ASSERT(StringConversion::stringToReal64(result, r64r));
+ PEGASUS_TEST_ASSERT(fabs(r64 - r64r) < r64/1000);
+ }
+
+ {
+ r64 = 0;
+ const char* result = Real64ToString(buffer, r64, size);
+ PEGASUS_TEST_ASSERT(strlen(result) == size);
+ PEGASUS_TEST_ASSERT(StringConversion::stringToReal64(result, r64r));
+ PEGASUS_TEST_ASSERT(fabs(r64 - r64r) < .0001);
+ }
+
+ {
+ r64 = 10.0E-0001;
+ const char* result = Real64ToString(buffer, r64, size);
+ PEGASUS_TEST_ASSERT(strlen(result) == size);
+ PEGASUS_TEST_ASSERT(StringConversion::stringToReal64(result, r64r));
+ PEGASUS_TEST_ASSERT(fabs(r64 - r64r) < r64/1000);
+ }
+ {
+ r64 = 10.0E+5;
+ const char* result = Real64ToString(buffer, r64, size);
+ PEGASUS_TEST_ASSERT(strlen(result) == size);
+ PEGASUS_TEST_ASSERT(StringConversion::stringToReal64(result, r64r));
+ PEGASUS_TEST_ASSERT(fabs(r64 - r64r) < r64/1000);
+ }
+}
+
int main(int argc, char** argv)
{
testIntegerToStringConversions();
testStringToSint64();
testCheckSintBounds();
testStringToReal64();
+ testReal32ToString();
+ testReal64ToString();
cout << argv[0] << " +++++ passed all tests" << endl;