Axis calculation of quaternions from small angles (#272)

* lower 0-angle rotation denominator threshold in
axis calculation to get axis from smaller rotations

* lower quaternion axis denominator threshold further for 64 bit implementation
diff --git a/lib/src/vector_math/quaternion.dart b/lib/src/vector_math/quaternion.dart
index b02aba7..ef17fd0 100644
--- a/lib/src/vector_math/quaternion.dart
+++ b/lib/src/vector_math/quaternion.dart
@@ -293,7 +293,7 @@
   /// [axis] of rotation.
   Vector3 get axis {
     final den = 1.0 - (_qStorage[3] * _qStorage[3]);
-    if (den < 0.0005) {
+    if (den < 0.00002) {
       // 0-angle rotation, so axis does not matter
       return Vector3.zero();
     }
diff --git a/lib/src/vector_math_64/quaternion.dart b/lib/src/vector_math_64/quaternion.dart
index 6f428a8..e4f4842 100644
--- a/lib/src/vector_math_64/quaternion.dart
+++ b/lib/src/vector_math_64/quaternion.dart
@@ -293,7 +293,7 @@
   /// [axis] of rotation.
   Vector3 get axis {
     final den = 1.0 - (_qStorage[3] * _qStorage[3]);
-    if (den < 0.0005) {
+    if (den < 1e-9) {
       // 0-angle rotation, so axis does not matter
       return Vector3.zero();
     }
diff --git a/test/quaternion_test.dart b/test/quaternion_test.dart
index 3ba0a75..6d014cc 100644
--- a/test/quaternion_test.dart
+++ b/test/quaternion_test.dart
@@ -7,6 +7,7 @@
 
 import 'package:test/test.dart';
 import 'package:vector_math/vector_math.dart';
+import 'package:vector_math/vector_math_64.dart' as v64;
 
 import 'test_utils.dart';
 
@@ -212,6 +213,18 @@
   }
 }
 
+void testSmallAngleQuaternionAxis() {
+  final quaternion32 =
+      Quaternion.axisAngle(Vector3(0.0, 0.0, 1.0), 0.6 * degrees2Radians);
+  relativeTest(quaternion32.axis, Vector3(0.0, 0.0, 1.0));
+  relativeTest(quaternion32.radians, 0.6 * degrees2Radians);
+  final quaternion64 =
+      v64.Quaternion.axisAngle(v64.Vector3(0, 0, 1), 0.01 * degrees2Radians);
+  expect(
+      quaternion64.axis.relativeError(v64.Vector3(0, 0, 1)), closeTo(0, 1e-5));
+  expect(quaternion64.radians, closeTo(0.01 * degrees2Radians, 1e-5));
+}
+
 void main() {
   group('Quaternion', () {
     test('Float32List instacing', testQuaternionInstacinfFromFloat32List);
@@ -223,5 +236,6 @@
     test('Normalize', testQuaternionNormalize);
     test('Axis-Angle', testQuaternionAxisAngle);
     test('Construction from two vectors', testFromTwoVectors);
+    test('Axis of quaternion from small angle', testSmallAngleQuaternionAxis);
   });
 }