@@ -1557,7 +1557,8 @@ function autoTickRound(ax) {
15571557 var rangeexp = Math . floor ( Math . log ( maxend ) / Math . LN10 + 0.01 ) ;
15581558 var minexponent = ax . minexponent === undefined ? 3 : ax . minexponent ;
15591559 if ( Math . abs ( rangeexp ) > minexponent ) {
1560- if ( isSIFormat ( ax . exponentformat ) && ! beyondSI ( rangeexp ) ) {
1560+ if ( ( isSIFormat ( ax . exponentformat ) && ax . exponentformat !== 'SI extended' && ! beyondSI ( rangeexp ) ) ||
1561+ ( isSIFormat ( ax . exponentformat ) && ax . exponentformat === 'SI extended' && ! beyondSIExtended ( rangeexp ) ) ) {
15611562 ax . _tickexponent = 3 * Math . round ( ( rangeexp - 1 ) / 3 ) ;
15621563 } else ax . _tickexponent = rangeexp ;
15631564 }
@@ -1914,7 +1915,8 @@ function formatLog(ax, out, hover, extraPrecision, hideexp) {
19141915 var p = + parts [ 1 ] ;
19151916 var absP = Math . abs ( p ) ;
19161917 var exponentFormat = ax . exponentformat ;
1917- if ( exponentFormat === 'power' || ( isSIFormat ( exponentFormat ) && beyondSI ( p ) ) ) {
1918+ if ( exponentFormat === 'power' || ( isSIFormat ( exponentFormat ) && exponentFormat !== 'SI extended' && beyondSI ( p ) ) ||
1919+ ( isSIFormat ( exponentFormat ) && exponentFormat === 'SI extended' && beyondSIExtended ( p ) ) ) {
19181920 out . text = parts [ 0 ] ;
19191921 if ( absP > 0 ) out . text += 'x10' ;
19201922 if ( out . text === '1x10' ) out . text = '10' ;
@@ -2063,9 +2065,10 @@ function num2frac(num) {
20632065// also automatically switch to sci. notation
20642066var SIPREFIXES = [ 'f' , 'p' , 'n' , 'μ' , 'm' , '' , 'k' , 'M' , 'G' , 'T' ] ;
20652067
2066- function isSIFormat ( exponentFormat ) {
2067- return exponentFormat === 'SI' || exponentFormat === 'B' ;
2068- }
2068+ // extending SI prefixes
2069+ var SIPREFIXES_EXTENDED = [ 'q' , 'r' , 'y' , 'z' , 'a' , ...SIPREFIXES , 'P' , 'E' , 'Z' , 'Y' , 'R' , 'Q' ] ;
2070+
2071+ const isSIFormat = ( exponentFormat ) => [ 'SI' , 'SI extended' , 'B' ] . includes ( exponentFormat ) ;
20692072
20702073// are we beyond the range of common SI prefixes?
20712074// 10^-16 -> 1x10^-16
@@ -2078,6 +2081,26 @@ function beyondSI(exponent) {
20782081 return exponent > 14 || exponent < - 15 ;
20792082}
20802083
2084+
2085+ // are we beyond the range of all SI prefixes?
2086+ // 10^-31 -> 1x10^-31
2087+ // 10^-30 -> 1q
2088+ // 10^-29 -> 10q
2089+ // ...
2090+ // 10^31 -> 10Q
2091+ // 10^32 -> 100Q
2092+ // 10^33 -> 1x10^33
2093+ function beyondSIExtended ( exponent ) {
2094+ return exponent > 32 || exponent < - 30 ;
2095+ }
2096+
2097+ function shouldSwitchSIToPowerFormat ( exponent , exponentFormat ) {
2098+ if ( ! isSIFormat ( exponentFormat ) ) return false ;
2099+ if ( exponentFormat === 'SI extended' && beyondSIExtended ( exponent ) ) return true ;
2100+ if ( exponentFormat !== 'SI extended' && beyondSI ( exponent ) ) return true ;
2101+ return false ;
2102+ }
2103+
20812104function numFormat ( v , ax , fmtoverride , hover ) {
20822105 var isNeg = v < 0 ;
20832106 // max number of digits past decimal point to show
@@ -2153,7 +2176,7 @@ function numFormat(v, ax, fmtoverride, hover) {
21532176
21542177 // add exponent
21552178 if ( exponent && exponentFormat !== 'hide' ) {
2156- if ( isSIFormat ( exponentFormat ) && beyondSI ( exponent ) ) exponentFormat = 'power' ;
2179+ if ( shouldSwitchSIToPowerFormat ( exponent , exponentFormat ) ) exponentFormat = 'power' ;
21572180
21582181 var signedExponent ;
21592182 if ( exponent < 0 ) signedExponent = MINUS_SIGN + - exponent ;
@@ -2167,7 +2190,9 @@ function numFormat(v, ax, fmtoverride, hover) {
21672190 } else if ( exponentFormat === 'B' && exponent === 9 ) {
21682191 v += 'B' ;
21692192 } else if ( isSIFormat ( exponentFormat ) ) {
2170- v += SIPREFIXES [ exponent / 3 + 5 ] ;
2193+ v += exponentFormat === 'SI extended'
2194+ ? SIPREFIXES_EXTENDED [ exponent / 3 + 10 ]
2195+ : SIPREFIXES [ exponent / 3 + 5 ] ;
21712196 }
21722197 }
21732198
0 commit comments