#pragma warning(pop)
#endif
-FCIMPL3(void, COMNumber::DoubleToNumberFC, double value, int precision, BYTE* number)
+FCIMPL3(void, COMNumber::DoubleToNumberFC, double value, int precision, NUMBER* number)
{
FCALL_CONTRACT;
- DoubleToNumber(value, precision, (NUMBER*)number);
+ DoubleToNumber(value, precision, number);
}
FCIMPLEND
-FCIMPL2(void, COMNumber::NumberToDoubleFC, BYTE* number, double* result)
+FCIMPL1(double, COMNumber::NumberToDoubleFC, NUMBER* number)
{
FCALL_CONTRACT;
- NumberToDouble((NUMBER*)number, result);
+ double d = 0;
+ NumberToDouble(number, &d);
+ return d;
}
FCIMPLEND
-FCIMPL2(FC_BOOL_RET, COMNumber::NumberBufferToDecimal, BYTE* number, DECIMAL* value)
+FCIMPL2(FC_BOOL_RET, COMNumber::NumberBufferToDecimal, NUMBER* number, DECIMAL* value)
{
FCALL_CONTRACT;
- FC_RETURN_BOOL(COMDecimal::NumberToDecimal((NUMBER *) number, value) != 0);
+ FC_RETURN_BOOL(COMDecimal::NumberToDecimal(number, value) != 0);
}
FCIMPLEND
class COMNumber
{
public:
- static FCDECL3(void, DoubleToNumberFC, double value, int precision, BYTE* number);
- static FCDECL2(void, NumberToDoubleFC, BYTE* number, double* value);
- static FCDECL2(FC_BOOL_RET, NumberBufferToDecimal, BYTE* number, DECIMAL* value);
+ static FCDECL3(void, DoubleToNumberFC, double value, int precision, NUMBER* number);
+ static FCDECL1(double, NumberToDoubleFC, NUMBER* number);
+ static FCDECL2(FC_BOOL_RET, NumberBufferToDecimal, NUMBER* number, DECIMAL* value);
static wchar_t* Int32ToDecChars(__in wchar_t* p, unsigned int value, int digits);
};
(*((uint*)&d + 1) >> 20) & 0x000007ff;
public static unsafe ulong Mantissa(double d) =>
- *((uint*)&d) | ((ulong)(*((uint*)&d + 1) & 0x000fffff) << 32);
+ *((ulong*)&d) & 0x000fffffffffffff;
public static unsafe bool Sign(double d) =>
(*((uint*)&d + 1) >> 31) != 0;
{
internal static partial class Number
{
- public static unsafe void DoubleToNumber(double value, int precision, ref NumberBuffer number)
- {
- fixed (NumberBuffer* numberPtr = &number)
- {
- DoubleToNumber(value, precision, (byte*)numberPtr);
- }
- }
[MethodImpl(MethodImplOptions.InternalCall)]
- private static extern unsafe void DoubleToNumber(double value, int precision, byte* number);
+ public static extern void DoubleToNumber(double value, int precision, ref NumberBuffer number);
-
- public static unsafe double NumberToDouble(ref NumberBuffer number)
- {
- fixed (NumberBuffer* numberPtr = &number)
- {
- double d = 0;
- NumberToDouble((byte*)numberPtr, &d);
- return d;
- }
- }
[MethodImpl(MethodImplOptions.InternalCall)]
- private static extern unsafe void NumberToDouble(byte* number, double* result);
-
+ public static extern double NumberToDouble(ref NumberBuffer number);
- public static unsafe bool NumberBufferToDecimal(ref Number.NumberBuffer number, ref decimal value)
- {
- fixed (NumberBuffer* numberPtr = &number)
- {
- return NumberBufferToDecimal((byte*)numberPtr, ref value);
- }
- }
[MethodImpl(MethodImplOptions.InternalCall)]
- private static extern unsafe bool NumberBufferToDecimal(byte* number, ref decimal value);
+ public static extern bool NumberBufferToDecimal(ref NumberBuffer number, ref decimal value);
}
}