/// <summary> /// This doesn't follow any kind of sane random distribution, so use this for testing purposes only. /// <para>5% of the time, mantissa is 0.</para> /// <para>10% of the time, mantissa is round.</para> /// </summary> public static BigDouble RandomBigDouble(double absMaxExponent) { if (Random.NextDouble() * 20 < 1) { return(BigDouble.Normalize(0, 0)); } var mantissa = Random.NextDouble() * 10; if (Random.NextDouble() * 10 < 1) { mantissa = Math.Round(mantissa); } mantissa *= Math.Sign(Random.NextDouble() * 2 - 1); var exponent = (long)(Math.Floor(Random.NextDouble() * absMaxExponent * 2) - absMaxExponent); return(BigDouble.Normalize(mantissa, exponent)); }
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) { EditorGUI.BeginProperty(position, label, property); position = EditorGUI.PrefixLabel(position, GUIUtility.GetControlID(FocusType.Passive), label); var indent = EditorGUI.indentLevel; EditorGUI.indentLevel = 0; const float gapWidth = 10; var mantissaRect = new Rect(position.x, position.y, (position.width - gapWidth) * 0.66f, position.height); var gapRect = new Rect(mantissaRect.x + mantissaRect.width, position.y, gapWidth, position.height); var exponentRect = new Rect(gapRect.x + gapRect.width, position.y, (position.width - gapWidth) * 0.33f, position.height); var mantissaProperty = property.FindPropertyRelative("mantissa"); var exponentProperty = property.FindPropertyRelative("exponent"); EditorGUI.BeginChangeCheck(); var mantissa = EditorGUI.DoubleField(mantissaRect, mantissaProperty.doubleValue, new GUIStyle(EditorStyles.numberField) { alignment = TextAnchor.MiddleRight }); EditorGUI.LabelField(gapRect, "e", new GUIStyle(GUIStyle.none) { alignment = TextAnchor.MiddleCenter }); var exponent = EditorGUI.LongField(exponentRect, exponentProperty.longValue); if (EditorGUI.EndChangeCheck()) { var normalized = BigDouble.Normalize(mantissa, exponent); mantissaProperty.doubleValue = normalized.Mantissa; exponentProperty.longValue = normalized.Exponent; } EditorGUI.indentLevel = indent; EditorGUI.EndProperty(); }