| // Copyright ©2018 The Gonum Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| // Copyright 2017 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package quat |
| |
| import "math" |
| |
| // Abs returns the absolute value (also called the modulus) of q. |
| func Abs(q Number) float64 { |
| // Special cases. |
| switch { |
| case IsInf(q): |
| return math.Inf(1) |
| case IsNaN(q): |
| return math.NaN() |
| } |
| |
| r, i, j, k := q.Real, q.Imag, q.Jmag, q.Kmag |
| if r < 0 { |
| r = -r |
| } |
| if i < 0 { |
| i = -i |
| } |
| if j < 0 { |
| j = -j |
| } |
| if k < 0 { |
| k = -k |
| } |
| if r < i { |
| r, i = i, r |
| } |
| if r < j { |
| r, j = j, r |
| } |
| if r < k { |
| r, k = k, r |
| } |
| if r == 0 { |
| return 0 |
| } |
| i /= r |
| j /= r |
| k /= r |
| return r * math.Sqrt(1+i*i+j*j+k*k) |
| } |