### 1.0 September 17th, 2002

- Initial release

### 1.0.1 June 27th, 2003

- Removed workarounds for Java 1.4.1 bugs
- Increased unit test coverage

### 1.0.2 February 5th, 2004

- Fixed some minor bugs
- Added AWT client Pi application
- Performance increase for some CPUs, e.g. Pentium 4

### 1.0.3 July 5th, 2004

- Fixed bug in Aprational constructor when numerator and denominator are both negative
- When running out of disk space with temporary files, attempt garbage collection

### 1.1 October 1st, 2004

- New negate() method
- New factorial() function
- New copySign() function
- Correct max memory size detection
- Parallel processing improvements
- Converted code to use Tiger features (generics, static import, concurrency utilities, StringBuilder, ...)

### 1.2 December 6th, 2004

- New mod() method for Apfloat and Aprational
- New precision(long) method for Apcomplex
- New size() method for ApfloatImpl
- Radix conversion with toRadix() methods
- Fixed bug with high roots of numbers with large exponent
- Calculator application

### 1.2.1 March 18th, 2005

- Fixed applet widths

### 1.3 November 28th, 2005

- Use javacc 4.0 for generics support in the .jj file
- For negative real numbers, ApcomplexMath.sqrt() returns always pure imaginary results
- Improved factorial algorithm
- Implements Formattable
- sum() and product() functions

### 1.3.1 August 30th, 2006

- Fixed applet Java 1.1 compatibility
- License changed to LGPL

### 1.4 March 11th, 2007

- Added Karatsuba multiplication
- Empty product and empty sum to not throw IllegalArgumentException (but return 1 and 0 correspondingly)
- OperationServer to use ExecutionService, not a custom thread pool
- Fixed applet Java 1.1 compatibility
- Bug fixes, e.g. for complex exp() and passing all the tests with any default factory implementation

### 1.4.1 August 22nd, 2007

- Fixed exceptions when max memory block is larger than Integer.MAX_VALUE
- Default element type to long in case of more than 4 GB heap
- Use ConcurrentHashMap for radix keys
- Use two-pass NTT if the data length is longer than Integer.MAX_VALUE

### 1.4.2 May 25th, 2008

- Avoid pi precalculation in case only Taylor series is sufficient for calculation of exp()
- Memory storage iterator performance improvement

### 1.5 March 7th, 2009

- Different exception subclasses
- One pi applet for both single-thread and multithread calculations
- allRoots() function
- Fixed precision helper classes
- Zeroth root and zeroth inverse root always throws ArithmeticException
- Ramanujan formula for faster pi verification 1/pi = 2*sqrt(2)/99^2*sum(n,0,infinity) (4n)!(1103+26390n) / ((n!)^4 * 396^4n)
- Redesign web pages (left navigation menu, style sheets, XHTML)
- Search engine optimization: pi calculator is the most commonly used search key
- Parallel pi calculator remove synchronization; use atomic longs for progress indicator
- Getting the ApfloatContext remove synchronization
- Heap based product calculation, take two smallest numbers from top of heap and recursively multiply, put back to heap
- Applet default digits to million
- Applet default factory to use the actual default property
- Added shared memory treshold context parameter
- Parallel multiplication to utilize other idle threads waiting to lock the same shared memory lock

### 1.5.1 April 25th, 2009

- Added parallel and distributed Ramanujan algorithm for pi
- Optimized NTT convolution strategy to avoid approximately half of the disk reads and writes when data fits to max memory block
- Optimized NTT convolution strategy to conserve memory usage even when only memory data storages are used (synchronized on shared memory block)
- Factor 3 NTT parallelized for six-step transform case
- For disk data storage transfer, use the configured block size instead of system default (8kB, which is too small)
- Fixed bug in missing autoconvolution in squaring with NTT convolution strategy
- Fixed bug in missing radix match check in addOrSubtract, multiply and divideShort

### 1.5.2 August 26th, 2009

- Improved parallel pi implementation by not doing parallel binsplits except for small enough ranges of terms (to improve memory usage and reduce waits due to parallel threads doing inequal amount of work)
- Modular inverse support for ApintMath.modPow()
- Wrote tutorial

### 1.6 June 12th, 2010

- Added Apint.toBigInteger()
- Added log(x, b)
- Added log(x, b), root(x, n, k) and inverseRoot(x, n, k) to calculator
- Added size()
- Soft caches for precalculated pi and log radix values
- Bug fix in double constructor
- Parallel element-by-element multiplication and carry-CRT
- Signed applets write files to temp directory (fixes no file write access bug)
- Optimized constructor taking BigInteger
- O(n log n) binary recursive GCD

### 1.6.1 June 22nd, 2010

- Fixed race condition in using non-threadsafe DataStorage.subsequence() in parallel codes in 3-NTT convolution and carry-CRT
- Made PiDistributed.Node protected instead of private
- Fixed StackOverflowError in uppercase formatTo()

### 1.6.2 March 10th, 2011

- Fixed bug in stream constructor when memory data storage changes to disk data storage
- Instead of finalization, use a reference queue for disk storage; remove garbage collected files more reliably in out-of-disk-space situations
- Accept "+" in exponent in Apfloat String constructor
- Use package-info.java instead of package.html
- When shutdown is in progress, avoid throwing NullPointerException from cache map (instead throw IllegalStateException)
- Instead of finalization, use reference queues; added gc() to BuilderFactory for explicit reference queue emptying

### 1.6.3 October 31st, 2011

- Allow getting transposed array of wider than tall section (for distributed version)
- Google App Engine cloud compatibility fixes
- Make some classes non-final and some Serializable
- Maven deployment

### 1.7.0 December 23rd, 2012

- Fractional part function Apfloat.frac() and subclass implementations
- Rounding function ApfloatMath.round() and AprationalMath.round()
- frac() and round() for FixedPrecisionApfloatHelper
- ApfloatImpl.frac()
- Apfloat.preferCompare() for determining if a reversed compareTo() mechanism should be used
- Aprational and Apint denominator returns ONE in same radix
- ApfloatContext.getProperty(String propertyName, String defaultValue)
- AdditionStrategy for SPI
- BuilderFactory.getElementSize(), getElementType(), getElementArrayType()
- Many new interfaces to SPI to allow more fine-grained custom algorithms: NTTStepStrategy, Factor3NTTStepStrategy, NTTConvolutionStepStrategy, CarryCRTStrategy, CarryCRTStepStrategy
- RawtypeMatrix retrofitted to MatrixStrategy SPI and made public more generic permuteToDoubleWidth(), permuteToHalfWidth(): RawtypeMatrixStrategy
- Builders for the new SPI interfaces: AdditionBuilder, CarryCRTBuilder, MatrixBuilder
- DataStorage.getArray(int mode, int startColumn, int columns, int rows), implGetArray(int mode, int startColumn, int columns, int rows)
- DataStorage.isCached() instead of implementing RandomAccess
- DataStorage.Iterator generic get() and set() methods
- Generic three-NTT convolution strategy that uses the new StepStrategy SPIs: ThreeNTTConvolutionStrategy, ParallelThreeNTTConvolutionStrategy; removed Rawtype3NTTConvolutionStrategy
- Generic classes for six-step and two-pass transforms that use the new StepStrategy SPIs: SixStepFNTStrategy, TwoPassFNTStrategy; removed RawtypeParallelFNTStrategy, RawtypeSixStepFNTStrategy and RawtypeTwoPassFNTStrategy
- Generic CRT class that uses the CRT steps SPI: StepCarryCRTStrategy
- RawtypeWTables for caching tables of n:th root of unity
- Moved common methods to AbstractDataStorageBuilder, AbstractConvolutionBuilder, AbstractNTTBuilder, AbstractStepFNTStrategy
- ParallelRunnable changed to abstract class; specify batch size; allow long ranges in addition to int ranges
- Internal classes implement Parallelizable to have setParallelRunner(ParallelRunner)
- Moved common methods to DiskDataStorage: implGetArray(), implGetTransposedArray(), setArray(), setTransposedArray(); new abstract methods createArrayAccess(), createTransposedArrayAccess()
- Moved table FNT for FNT steps and table FNT strategy to new base class RawtypeTableFNT
- Retrofitted RawtypeCarryCRT to RawtypeCarryCRTStepStrategy (mostly)
- Retrofitted RawtypeFactor3NTTStrategy to RawtypeFactor3NTTStepStrategy
- Removed RawtypeFactor3SixStepNTTStrategy as unnecessary (duplicate code, now being only done in RawtypeFactor3NTTStepStrategy)

### 1.7.1 March 19th, 2013

- Fixed bug in exp() with exception thrown in case of underflow with very small exponents

### 1.8.0 November 24th, 2013

- long memoryThreshold
- Dynamic default values for memoryThreshold, blockSize
- Default ExecutorService changed to use max numberOfProcessors - 1 threads and queue tasks
- ParallelRunner semantics changed to use the default ExecutorService, with work stealing, no more locking needed
- ParallelRunnable semantics changed to be run by many threads at the same time, work the same way for int and long length tasks
- Parallelizable changed to be just a marker interface (ParallelRunner does not need to be set, is used statically only)
- ApfloatImpl.size() is cached
- Lambert's W function
- toDegrees() and toRadians() functions
- Parallel sum and product implementations
- Simplify binsplit implementation in pi calculation
- DataStorage.Iterator is Serializable

### 1.8.1 February 22nd, 2014

- w(infinite precision) now throws exception
- Fixed bug with DataStorage.getArray() and DataStorage.getTransposedArray() offsets >= 2GB
- Fixed bug in TwoPassFNTStrategy trying to get array with size >= 2GB
- GCD returns value for large argument and zero
- Fixed calculator scale integer by negative value
- In sample applets, reset executor service after adjusting max number of processors
- Simplified ApfloatMath pi calculcation binsplit algorithm
- Two-argument complex pow() and log() optimize precision in some cases
- Optimize complex cos(), cosh(), sin(), sinh(), tan(), tanh() in case of real argument

### 1.8.2 January 21st, 2015

- xxxBaseMath performance optimizations
- Sample pi calculator performance optimizations
- Performance optimizations for small number calculations
- Performance optimizations for ApfloatContext.getContext()
- Fixes for memory data storage with larger than 12GB allocations

### 1.8.3 May 7th, 2017

- Add apfloat-aparapi module
- Fix precision of atan2() in some cases where result is very small
- Fix precision of exp() and log() if argument is very large
- Fix finite precision integer power in calculator

### 1.9.0 July 6th, 2019

- Require Java 8
- Java 9 performance optimizations with multiplyHigh()
- 64-bit implementation by default
- random() and randomGaussian() functons
- Aprational double constructor
- Exact number values
- Gamma function
- Assignment operators += -= *= /= ^= in calculator
- Min and max functions
- Use ForkJoinPool as executor service
- Improve parallel runner wait()
- System overrides for ApfloatContext properties
- IsInteger methods
- Tune convolution parameters

### 1.9.1 August 15th, 2019

- Fixes for applets
- Fix precision of consecutive calls to randomGaussian()
- Add fixed input precision option to calculator
- Remove old Java bug workaround

### 1.10.0 May 16th, 2021

- MIT license
- Incomplete gamma function
- Euler gamma constant
- nextAfter(), nextUp(), nextDown(), ulp()
- test() methods
- Fix AGM bugs
- Fix lambert W
- Fix older JDK binary compatibility (-release build parameter)

### 1.10.1. August 7th, 2021

- Automatic module names
- Incomplete gamma fixes
- Arcus function fixes
- Radix handling fixes
- Return zeros with proper radix