<commit_before>#pragma once

// sqrt_tables.hpp: specialized posit configurations to support efficient sqrt for small posits
//
// Copyright (C) 2017-2018 Stillwater Supercomputing, Inc.
//
// This file is part of the universal numbers project, which is released under an MIT Open Source license.

namespace sw {
	namespace unum {

		// need a better code generator for the small posits up to nbits = 8
		// TODO: find if there is any structure in these tables across nbits and es

		template<size_t nbits, size_t es>
		void GenerateSqrtTable() {
			constexpr unsigned int NR_POSITS = (unsigned(1) << (nbits - 1)); // no need for negative posits

			std::cout << std::setprecision(20);
			posit<nbits, es> p;
			for (unsigned int i = 0; i < NR_POSITS; i++) {
				p.set_raw_bits(i);
				double ref = std::sqrt(double(p));
				posit<nbits, es> psqrt(ref);
				std::cout << p.get() << " " << psqrt.get() << "      " << p << " " << psqrt << " ref: " << ref << std::endl;
			}
			std::cout << std::setprecision(5);
		}

		// roots for posit<3,0>
		//   v   r       v   r          high precision root
		//  000 000      0   0     ref : 0
		//  001 001      0.5 0.5   ref : 0.70710678118654757274
		//	010 010      1   1     ref : 1
		//	011 010      2   1     ref : 1.4142135623730951455
		template<>
		inline posit<3, 0> sqrt(const posit<3, 0>& a) {
			posit<3, 0> p;
			if (a.isneg() || a.isnar()) {
				p.setnar();
				return p;
			}
			unsigned roots[4] = { 0, 1, 2, 2 };
			unsigned root = roots[a.encoding()];
			p.set_raw_bits(root);
			return p;
		}

		// roots for posit<3,1>
		//   v   r       v   r          high precision root
		//  000 000      0    0     ref : 0
		//  001 001      0.25 0.5   ref : 0.5
		//	010 010      1   1      ref : 1
		//	011 010      4   1      ref : 1
		template<>
		inline posit<3, 1> sqrt(const posit<3, 1>& a) {
			posit<3, 1> p;
			if (a.isneg() || a.isnar()) {
				p.setnar();
				return p;
			}
			unsigned roots[4] = { 0, 1, 2, 2 };
			unsigned root = roots[a.encoding()];
			p.set_raw_bits(root);
			return p;
		}

		// roots for posit<4,0>
		//   v    r        v    r        high precision root
		//	0000 0000      0    0        ref: 0
		//	0001 0010      0.25 0.5      ref: 0.5
		//	0010 0011      0.5  0.75     ref : 0.70710678118654757274
		//	0011 0011      0.75 0.75     ref : 0.86602540378443859659
		//	0100 0100      1    1        ref : 1
		//	0101 0100      1.5  1        ref : 1.2247448713915889407
		//	0110 0101      2    1.5      ref : 1.4142135623730951455
		//	0111 0110      4    2        ref : 2
		template<>
		inline posit<4, 0> sqrt(const posit<4, 0>& a) {
			posit<4, 0> p;
			if (a.isneg() || a.isnar()) {
				p.setnar();
				return p;
			}
			unsigned roots[8] = { 0, 2, 3, 3, 4, 4, 5, 6 };
			unsigned root = roots[a.encoding()];
			p.set_raw_bits(root);
			return p;
		}

		// roots for posit<5,0>
		//   v     r         v    r        high precision root
		//	00000 00000      0     0       ref: 0
		//	00001 00011      0.125 0.375   ref : 0.35355339059327378637
		//	00010 00100      0.25  0.5     ref : 0.5
		//	00011 00101      0.375 0.625   ref : 0.61237243569579447033
		//	00100 00110      0.5   0.75    ref : 0.70710678118654757274
		//	00101 00110      0.625 0.75    ref : 0.7905694150420948807
		//	00110 00111      0.75  0.875   ref : 0.86602540378443859659
		//	00111 00111      0.875 0.875   ref : 0.93541434669348533237
		//	01000 01000      1     1       ref : 1
		//	01001 01000      1.25  1       ref : 1.1180339887498949025
		//	01010 01001      1.5   1.25    ref : 1.2247448713915889407
		//	01011 01001      1.75  1.25    ref : 1.3228756555322953581
		//	01100 01010      2     1.5     ref : 1.4142135623730951455
		//	01101 01011      3     1.75    ref : 1.7320508075688771932
		//	01110 01100      4     2       ref : 2
		//	01111 01101      8     3       ref : 2.8284271247461902909
		template<>
		inline posit<5, 0> sqrt(const posit<5, 0>& a) {
			posit<5, 0> p;
			if (a.isneg() || a.isnar()) {
				p.setnar();
				return p;
			}
			unsigned roots[16] = { 0, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 11, 12, 13 };
			unsigned root = roots[a.encoding()];
			p.set_raw_bits(root);
			return p;
		}

		// roots for posit<8,0>
		//   v       r         v		r        high precision root
		//	00000000 00000000 + 0		+ 0 ref: 0
		//	00000001 00001000 + 0.015625 + 0.125 ref : 0.125
		//	00000010 00001011 + 0.03125 + 0.171875 ref : 0.17677669529663689318
		//	00000011 00001110 + 0.046875 + 0.21875 ref : 0.21650635094610964915
		//	00000100 00010000 + 0.0625 + 0.25 ref : 0.25
		//	00000101 00010010 + 0.078125 + 0.28125 ref : 0.27950849718747372563
		//	00000110 00010100 + 0.09375 + 0.3125 ref : 0.30618621784789723517
		//	00000111 00010101 + 0.109375 + 0.328125 ref : 0.33071891388307383952
		//	00001000 00010111 + 0.125 + 0.359375 ref : 0.35355339059327378637
		//	00001001 00011000 + 0.140625 + 0.375 ref : 0.375
		//	00001010 00011001 + 0.15625 + 0.390625 ref : 0.39528470752104744035
		//	00001011 00011011 + 0.171875 + 0.421875 ref : 0.41457809879442497625
		//	00001100 00011100 + 0.1875 + 0.4375 ref : 0.43301270189221929829
		//	00001101 00011101 + 0.203125 + 0.453125 ref : 0.45069390943299864061
		//	00001110 00011110 + 0.21875 + 0.46875 ref : 0.46770717334674266619
		//	00001111 00011111 + 0.234375 + 0.484375 ref : 0.48412291827592712767
		//	00010000 00100000 + 0.25 + 0.5 ref : 0.5
		//	00010001 00100001 + 0.265625 + 0.515625 ref : 0.51538820320220757321
		//	00010010 00100010 + 0.28125 + 0.53125 ref : 0.53033008588991059629
		//	00010011 00100011 + 0.296875 + 0.546875 ref : 0.54486236794258424698
		//	00010100 00100100 + 0.3125 + 0.5625 ref : 0.55901699437494745126
		//	00010101 00100101 + 0.328125 + 0.578125 ref : 0.57282196186947997862
		//	00010110 00100110 + 0.34375 + 0.59375 ref : 0.58630196997792871638
		//	00010111 00100110 + 0.359375 + 0.59375 ref : 0.59947894041408988919
		//	00011000 00100111 + 0.375 + 0.609375 ref : 0.61237243569579447033
		//	00011001 00101000 + 0.390625 + 0.625 ref : 0.625
		//	00011010 00101001 + 0.40625 + 0.640625 ref : 0.63737743919909806145
		//	00011011 00101010 + 0.421875 + 0.65625 ref : 0.64951905283832900295
		//	00011100 00101010 + 0.4375 + 0.65625 ref : 0.66143782776614767904
		//	00011101 00101011 + 0.453125 + 0.671875 ref : 0.67314560089181296743
		//	00011110 00101100 + 0.46875 + 0.6875 ref : 0.68465319688145764854
		//	00011111 00101101 + 0.484375 + 0.703125 ref : 0.6959705453537526898
		//	00100000 00101101 + 0.5 + 0.703125 ref : 0.70710678118654757274
		//	00100001 00101110 + 0.515625 + 0.71875 ref : 0.71807033081725357704
		//	00100010 00101111 + 0.53125 + 0.734375 ref : 0.72886898685566259282
		//	00100011 00101111 + 0.546875 + 0.734375 ref : 0.73950997288745201619
		//	00100100 00110000 + 0.5625 + 0.75 ref : 0.75
		//	00100101 00110001 + 0.578125 + 0.765625 ref : 0.76034531628727741737
		//	00100110 00110001 + 0.59375 + 0.765625 ref : 0.77055175037112200176
		//	00100111 00110010 + 0.609375 + 0.78125 ref : 0.78062474979979978862
		//	00101000 00110011 + 0.625 + 0.796875 ref : 0.7905694150420948807
		//	00101001 00110011 + 0.640625 + 0.796875 ref : 0.8003905296791060664
		//	00101010 00110100 + 0.65625 + 0.8125 ref : 0.8100925873009825473
		//	00101011 00110100 + 0.671875 + 0.8125 ref : 0.819679815537750045
		//	00101100 00110101 + 0.6875 + 0.828125 ref : 0.8291561975888499525
		//	00101101 00110110 + 0.703125 + 0.84375 ref : 0.83852549156242117689
		//	00101110 00110110 + 0.71875 + 0.84375 ref : 0.84779124789065851697
		//	00101111 00110111 + 0.734375 + 0.859375 ref : 0.85695682505013048846
		//	00110000 00110111 + 0.75 + 0.859375 ref : 0.86602540378443859659
		//	00110001 00111000 + 0.765625 + 0.875 ref : 0.875
		//	00110010 00111001 + 0.78125 + 0.890625 ref : 0.88388347648318443817
		//	00110011 00111001 + 0.796875 + 0.890625 ref : 0.89267855356785630327
		//	00110100 00111010 + 0.8125 + 0.90625 ref : 0.90138781886599728121
		//	00110101 00111010 + 0.828125 + 0.90625 ref : 0.91001373616006475675
		//	00110110 00111011 + 0.84375 + 0.921875 ref : 0.91855865354369181652
		//	00110111 00111011 + 0.859375 + 0.921875 ref : 0.92702481088695787292
		//	00111000 00111100 + 0.875 + 0.9375 ref : 0.93541434669348533237
		//	00111001 00111100 + 0.890625 + 0.9375 ref : 0.94372930440884372771
		//	00111010 00111101 + 0.90625 + 0.953125 ref : 0.95197163823298858176
		//	00111011 00111101 + 0.921875 + 0.953125 ref : 0.96014321848357597755
		//	00111100 00111110 + 0.9375 + 0.96875 ref : 0.96824583655185425535
		//	00111101 00111110 + 0.953125 + 0.96875 ref : 0.97628120948833174708
		//	00111110 00111111 + 0.96875 + 0.984375 ref : 0.9842509842514763907
		//	00111111 00111111 + 0.984375 + 0.984375 ref : 0.99215674164922151856
		//	01000000 01000000 + 1 + 1 ref : 1
		//	01000001 01000000 + 1.03125 + 1 ref : 1.0155048005794951038
		//	01000010 01000001 + 1.0625 + 1.03125 ref : 1.0307764064044151464
		//	01000011 01000001 + 1.09375 + 1.03125 ref : 1.0458250331675944533
		//	01000100 01000010 + 1.125 + 1.0625 ref : 1.0606601717798211926
		//	01000101 01000010 + 1.15625 + 1.0625 ref : 1.0752906583803283347
		//	01000110 01000011 + 1.1875 + 1.09375 ref : 1.089724735885168494
		//	01000111 01000011 + 1.21875 + 1.09375 ref : 1.1039701082909809671
		//	01001000 01000100 + 1.25 + 1.125 ref : 1.1180339887498949025
		//	01001001 01000100 + 1.28125 + 1.125 ref : 1.1319231422671771625
		//	01001010 01000101 + 1.3125 + 1.15625 ref : 1.1456439237389599572
		//	01001011 01000101 + 1.34375 + 1.15625 ref : 1.1592023119369629924
		//	01001100 01000110 + 1.375 + 1.1875 ref : 1.1726039399558574328
		//	01001101 01000110 + 1.40625 + 1.1875 ref : 1.1858541225631422655
		//	01001110 01000110 + 1.4375 + 1.1875 ref : 1.1989578808281797784
		//	01001111 01000111 + 1.46875 + 1.21875 ref : 1.2119199643540823352
		//	01010000 01000111 + 1.5 + 1.21875 ref : 1.2247448713915889407
		//	01010001 01001000 + 1.53125 + 1.25 ref : 1.237436867076458169
		//	01010010 01001000 + 1.5625 + 1.25 ref : 1.25
		//	01010011 01001000 + 1.59375 + 1.25 ref : 1.2624381172952596764
		//	01010100 01001001 + 1.625 + 1.28125 ref : 1.2747548783981961229
		//	01010101 01001001 + 1.65625 + 1.28125 ref : 1.2869537676233751
		//	01010110 01001010 + 1.6875 + 1.3125 ref : 1.2990381056766580059
		//	01010111 01001010 + 1.71875 + 1.3125 ref : 1.3110110602126894275
		//	01011000 01001010 + 1.75 + 1.3125 ref : 1.3228756555322953581
		//	01011001 01001011 + 1.78125 + 1.34375 ref : 1.3346347815039139029
		//	01011010 01001011 + 1.8125 + 1.34375 ref : 1.3462912017836259349
		//	01011011 01001011 + 1.84375 + 1.34375 ref : 1.3578475614000269367
		//	01011100 01001100 + 1.875 + 1.375 ref : 1.3693063937629152971
		//	01011101 01001100 + 1.90625 + 1.375 ref : 1.3806701271484076443
		//	01011110 01001101 + 1.9375 + 1.40625 ref : 1.3919410907075053796
		//	01011111 01001101 + 1.96875 + 1.40625 ref : 1.4031215200402280541
		//	01100000 01001101 + 2 + 1.40625 ref : 1.4142135623730951455
		//	01100001 01001111 + 2.125 + 1.46875 ref : 1.4577379737113251856
		//	01100010 01010000 + 2.25 + 1.5 ref : 1.5
		//	01100011 01010001 + 2.375 + 1.53125 ref : 1.5411035007422440035
		//	01100100 01010011 + 2.5 + 1.59375 ref : 1.5811388300841897614
		//	01100101 01010100 + 2.625 + 1.625 ref : 1.6201851746019650946
		//	01100110 01010101 + 2.75 + 1.65625 ref : 1.658312395177699905
		//	01100111 01010110 + 2.875 + 1.6875 ref : 1.6955824957813170339
		//	01101000 01010111 + 3 + 1.71875 ref : 1.7320508075688771932
		//	01101001 01011001 + 3.125 + 1.78125 ref : 1.7677669529663688763
		//	01101010 01011010 + 3.25 + 1.8125 ref : 1.8027756377319945624
		//	01101011 01011011 + 3.375 + 1.84375 ref : 1.837117307087383633
		//	01101100 01011100 + 3.5 + 1.875 ref : 1.8708286933869706647
		//	01101101 01011101 + 3.625 + 1.90625 ref : 1.9039432764659771635
		//	01101110 01011110 + 3.75 + 1.9375 ref : 1.9364916731037085107
		//	01101111 01011111 + 3.875 + 1.96875 ref : 1.9685019685029527814
		//	01110000 01100000 + 4 + 2 ref : 2
		//	01110001 01100001 + 4.5 + 2.125 ref : 2.1213203435596423851
		//	01110010 01100010 + 5 + 2.25 ref : 2.2360679774997898051
		//	01110011 01100011 + 5.5 + 2.375 ref : 2.3452078799117148655
		//	01110100 01100100 + 6 + 2.5 ref : 2.4494897427831778813
		//	01110101 01100100 + 6.5 + 2.5 ref : 2.5495097567963922458
		//	01110110 01100101 + 7 + 2.625 ref : 2.6457513110645907162
		//	01110111 01100110 + 7.5 + 2.75 ref : 2.7386127875258305941
		//	01111000 01100111 + 8 + 2.875 ref : 2.8284271247461902909
		//	01111001 01101001 + 10 + 3.125 ref : 3.1622776601683795228
		//	01111010 01101100 + 12 + 3.5 ref : 3.4641016151377543864
		//	01111011 01101110 + 14 + 3.75 ref : 3.7416573867739413295
		//	01111100 01110000 + 16 + 4 ref : 4
		//	01111101 01110010 + 24 + 5 ref : 4.8989794855663557627
		//	01111110 01110011 + 32 + 5.5 ref : 5.6568542494923805819
		//	01111111 01111000 + 64 + 8 ref : 8
		template<>
		inline posit<8, 0> sqrt(const posit<8, 0>& a) {
			posit<8, 0> p;
			if (a.isneg() || a.isnar()) {
				p.setnar();
				return p;
			}
			unsigned roots[128] = { 
				0x00, 0x08, 0x0B, 0x0E, 0x10, 0x12, 0x14, 0x15, 
				0x17, 0x18, 0x19, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
				0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x26,
				0x27, 0x28, 0x29, 0x2A, 0x2A, 0x2B, 0x2C, 0x2D,
				0x2D, 0x2E, 0x2F, 0x2F, 0x30, 0x31, 0x31, 0x32,
				0x33, 0x33, 0x34, 0x34, 0x35, 0x36, 0x36, 0x37,
				0x37, 0x38, 0x39, 0x39, 0x3A, 0x3A, 0x3B, 0x3B,
				0x3C, 0x3C, 0x3D, 0x3D, 0x3E, 0x3E, 0x3F, 0x3F,
				0x40, 0x40, 0x41, 0x41, 0x42, 0x42, 0x43, 0x43,
				0x44, 0x44, 0x45, 0x45, 0x46, 0x46, 0x46, 0x47,
				0x47, 0x48, 0x48, 0x48, 0x49, 0x49, 0x4A, 0x4A,
				0x4A, 0x4B, 0x4B, 0x4B, 0x4C, 0x4C, 0x4D, 0x4D,
				0x4D, 0x4F, 0x50, 0x51, 0x53, 0x54, 0x55, 0x56,
				0x57, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F,
				0x60, 0x61, 0x62, 0x63, 0x64, 0x64, 0x65, 0x66,
				0x67, 0x69, 0x6C, 0x6E, 0x70, 0x72, 0x73, 0x78
			};
			unsigned root = roots[a.encoding()];
			p.set_raw_bits(root);
			return p;
		}

	}  // namespace unum

}  // namespace sw<commit_msg>performance improvement: moving lookup tables to static constants<commit_after>#pragma once

// sqrt_tables.hpp: specialized posit configurations to support efficient sqrt for small posits
//
// Copyright (C) 2017-2018 Stillwater Supercomputing, Inc.
//
// This file is part of the universal numbers project, which is released under an MIT Open Source license.

namespace sw {
	namespace unum {

		// need a better code generator for the small posits up to nbits = 8
		// TODO: find if there is any structure in these tables across nbits and es

		template<size_t nbits, size_t es>
		void GenerateSqrtTable() {
			constexpr unsigned int NR_POSITS = (unsigned(1) << (nbits - 1)); // no need for negative posits

			std::cout << std::setprecision(20);
			posit<nbits, es> p;
			for (unsigned int i = 0; i < NR_POSITS; i++) {
				p.set_raw_bits(i);
				double ref = std::sqrt(double(p));
				posit<nbits, es> psqrt(ref);
				std::cout << p.get() << " " << psqrt.get() << "      " << p << " " << psqrt << " ref: " << ref << std::endl;
			}
			std::cout << std::setprecision(5);
		}

		// roots for posit<3,0>
		//   v   r       v   r          high precision root
		//  000 000      0   0     ref : 0
		//  001 001      0.5 0.5   ref : 0.70710678118654757274
		//	010 010      1   1     ref : 1
		//	011 010      2   1     ref : 1.4142135623730951455
		constexpr unsigned posit_3_0_roots[4] = { 0, 1, 2, 2 };
		template<>
		inline posit<3, 0> sqrt(const posit<3, 0>& a) {
			posit<3, 0> p;
			if (a.isneg() || a.isnar()) {
				p.setnar();
				return p;
			}
			unsigned root = posit_3_0_roots[a.encoding()];
			p.set_raw_bits(root);
			return p;
		}

		// roots for posit<3,1>
		//   v   r       v   r          high precision root
		//  000 000      0    0     ref : 0
		//  001 001      0.25 0.5   ref : 0.5
		//	010 010      1   1      ref : 1
		//	011 010      4   1      ref : 1
		constexpr unsigned posit_3_1_roots[4] = { 0, 1, 2, 2 };
		template<>
		inline posit<3, 1> sqrt(const posit<3, 1>& a) {
			posit<3, 1> p;
			if (a.isneg() || a.isnar()) {
				p.setnar();
				return p;
			}			
			unsigned root = posit_3_1_roots[a.encoding()];
			p.set_raw_bits(root);
			return p;
		}

		// roots for posit<4,0>
		//   v    r        v    r        high precision root
		//	0000 0000      0    0        ref: 0
		//	0001 0010      0.25 0.5      ref: 0.5
		//	0010 0011      0.5  0.75     ref : 0.70710678118654757274
		//	0011 0011      0.75 0.75     ref : 0.86602540378443859659
		//	0100 0100      1    1        ref : 1
		//	0101 0100      1.5  1        ref : 1.2247448713915889407
		//	0110 0101      2    1.5      ref : 1.4142135623730951455
		//	0111 0110      4    2        ref : 2
		constexpr unsigned posit_4_0_roots[8] = { 0, 2, 3, 3, 4, 4, 5, 6 };
		template<>
		inline posit<4, 0> sqrt(const posit<4, 0>& a) {
			posit<4, 0> p;
			if (a.isneg() || a.isnar()) {
				p.setnar();
				return p;
			}
			
			unsigned root = posit_4_0_roots[a.encoding()];
			p.set_raw_bits(root);
			return p;
		}

		// roots for posit<5,0>
		//   v     r         v    r        high precision root
		//	00000 00000      0     0       ref: 0
		//	00001 00011      0.125 0.375   ref : 0.35355339059327378637
		//	00010 00100      0.25  0.5     ref : 0.5
		//	00011 00101      0.375 0.625   ref : 0.61237243569579447033
		//	00100 00110      0.5   0.75    ref : 0.70710678118654757274
		//	00101 00110      0.625 0.75    ref : 0.7905694150420948807
		//	00110 00111      0.75  0.875   ref : 0.86602540378443859659
		//	00111 00111      0.875 0.875   ref : 0.93541434669348533237
		//	01000 01000      1     1       ref : 1
		//	01001 01000      1.25  1       ref : 1.1180339887498949025
		//	01010 01001      1.5   1.25    ref : 1.2247448713915889407
		//	01011 01001      1.75  1.25    ref : 1.3228756555322953581
		//	01100 01010      2     1.5     ref : 1.4142135623730951455
		//	01101 01011      3     1.75    ref : 1.7320508075688771932
		//	01110 01100      4     2       ref : 2
		//	01111 01101      8     3       ref : 2.8284271247461902909
		constexpr unsigned posit_5_0_roots[16] = { 0, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 11, 12, 13 };
		template<>
		inline posit<5, 0> sqrt(const posit<5, 0>& a) {
			posit<5, 0> p;
			if (a.isneg() || a.isnar()) {
				p.setnar();
				return p;
			}			
			unsigned root = posit_5_0_roots[a.encoding()];
			p.set_raw_bits(root);
			return p;
		}

		// roots for posit<8,0>
		//   v       r         v		r        high precision root
		//	00000000 00000000 + 0		+ 0 ref: 0
		//	00000001 00001000 + 0.015625 + 0.125 ref : 0.125
		//	00000010 00001011 + 0.03125 + 0.171875 ref : 0.17677669529663689318
		//	00000011 00001110 + 0.046875 + 0.21875 ref : 0.21650635094610964915
		//	00000100 00010000 + 0.0625 + 0.25 ref : 0.25
		//	00000101 00010010 + 0.078125 + 0.28125 ref : 0.27950849718747372563
		//	00000110 00010100 + 0.09375 + 0.3125 ref : 0.30618621784789723517
		//	00000111 00010101 + 0.109375 + 0.328125 ref : 0.33071891388307383952
		//	00001000 00010111 + 0.125 + 0.359375 ref : 0.35355339059327378637
		//	00001001 00011000 + 0.140625 + 0.375 ref : 0.375
		//	00001010 00011001 + 0.15625 + 0.390625 ref : 0.39528470752104744035
		//	00001011 00011011 + 0.171875 + 0.421875 ref : 0.41457809879442497625
		//	00001100 00011100 + 0.1875 + 0.4375 ref : 0.43301270189221929829
		//	00001101 00011101 + 0.203125 + 0.453125 ref : 0.45069390943299864061
		//	00001110 00011110 + 0.21875 + 0.46875 ref : 0.46770717334674266619
		//	00001111 00011111 + 0.234375 + 0.484375 ref : 0.48412291827592712767
		//	00010000 00100000 + 0.25 + 0.5 ref : 0.5
		//	00010001 00100001 + 0.265625 + 0.515625 ref : 0.51538820320220757321
		//	00010010 00100010 + 0.28125 + 0.53125 ref : 0.53033008588991059629
		//	00010011 00100011 + 0.296875 + 0.546875 ref : 0.54486236794258424698
		//	00010100 00100100 + 0.3125 + 0.5625 ref : 0.55901699437494745126
		//	00010101 00100101 + 0.328125 + 0.578125 ref : 0.57282196186947997862
		//	00010110 00100110 + 0.34375 + 0.59375 ref : 0.58630196997792871638
		//	00010111 00100110 + 0.359375 + 0.59375 ref : 0.59947894041408988919
		//	00011000 00100111 + 0.375 + 0.609375 ref : 0.61237243569579447033
		//	00011001 00101000 + 0.390625 + 0.625 ref : 0.625
		//	00011010 00101001 + 0.40625 + 0.640625 ref : 0.63737743919909806145
		//	00011011 00101010 + 0.421875 + 0.65625 ref : 0.64951905283832900295
		//	00011100 00101010 + 0.4375 + 0.65625 ref : 0.66143782776614767904
		//	00011101 00101011 + 0.453125 + 0.671875 ref : 0.67314560089181296743
		//	00011110 00101100 + 0.46875 + 0.6875 ref : 0.68465319688145764854
		//	00011111 00101101 + 0.484375 + 0.703125 ref : 0.6959705453537526898
		//	00100000 00101101 + 0.5 + 0.703125 ref : 0.70710678118654757274
		//	00100001 00101110 + 0.515625 + 0.71875 ref : 0.71807033081725357704
		//	00100010 00101111 + 0.53125 + 0.734375 ref : 0.72886898685566259282
		//	00100011 00101111 + 0.546875 + 0.734375 ref : 0.73950997288745201619
		//	00100100 00110000 + 0.5625 + 0.75 ref : 0.75
		//	00100101 00110001 + 0.578125 + 0.765625 ref : 0.76034531628727741737
		//	00100110 00110001 + 0.59375 + 0.765625 ref : 0.77055175037112200176
		//	00100111 00110010 + 0.609375 + 0.78125 ref : 0.78062474979979978862
		//	00101000 00110011 + 0.625 + 0.796875 ref : 0.7905694150420948807
		//	00101001 00110011 + 0.640625 + 0.796875 ref : 0.8003905296791060664
		//	00101010 00110100 + 0.65625 + 0.8125 ref : 0.8100925873009825473
		//	00101011 00110100 + 0.671875 + 0.8125 ref : 0.819679815537750045
		//	00101100 00110101 + 0.6875 + 0.828125 ref : 0.8291561975888499525
		//	00101101 00110110 + 0.703125 + 0.84375 ref : 0.83852549156242117689
		//	00101110 00110110 + 0.71875 + 0.84375 ref : 0.84779124789065851697
		//	00101111 00110111 + 0.734375 + 0.859375 ref : 0.85695682505013048846
		//	00110000 00110111 + 0.75 + 0.859375 ref : 0.86602540378443859659
		//	00110001 00111000 + 0.765625 + 0.875 ref : 0.875
		//	00110010 00111001 + 0.78125 + 0.890625 ref : 0.88388347648318443817
		//	00110011 00111001 + 0.796875 + 0.890625 ref : 0.89267855356785630327
		//	00110100 00111010 + 0.8125 + 0.90625 ref : 0.90138781886599728121
		//	00110101 00111010 + 0.828125 + 0.90625 ref : 0.91001373616006475675
		//	00110110 00111011 + 0.84375 + 0.921875 ref : 0.91855865354369181652
		//	00110111 00111011 + 0.859375 + 0.921875 ref : 0.92702481088695787292
		//	00111000 00111100 + 0.875 + 0.9375 ref : 0.93541434669348533237
		//	00111001 00111100 + 0.890625 + 0.9375 ref : 0.94372930440884372771
		//	00111010 00111101 + 0.90625 + 0.953125 ref : 0.95197163823298858176
		//	00111011 00111101 + 0.921875 + 0.953125 ref : 0.96014321848357597755
		//	00111100 00111110 + 0.9375 + 0.96875 ref : 0.96824583655185425535
		//	00111101 00111110 + 0.953125 + 0.96875 ref : 0.97628120948833174708
		//	00111110 00111111 + 0.96875 + 0.984375 ref : 0.9842509842514763907
		//	00111111 00111111 + 0.984375 + 0.984375 ref : 0.99215674164922151856
		//	01000000 01000000 + 1 + 1 ref : 1
		//	01000001 01000000 + 1.03125 + 1 ref : 1.0155048005794951038
		//	01000010 01000001 + 1.0625 + 1.03125 ref : 1.0307764064044151464
		//	01000011 01000001 + 1.09375 + 1.03125 ref : 1.0458250331675944533
		//	01000100 01000010 + 1.125 + 1.0625 ref : 1.0606601717798211926
		//	01000101 01000010 + 1.15625 + 1.0625 ref : 1.0752906583803283347
		//	01000110 01000011 + 1.1875 + 1.09375 ref : 1.089724735885168494
		//	01000111 01000011 + 1.21875 + 1.09375 ref : 1.1039701082909809671
		//	01001000 01000100 + 1.25 + 1.125 ref : 1.1180339887498949025
		//	01001001 01000100 + 1.28125 + 1.125 ref : 1.1319231422671771625
		//	01001010 01000101 + 1.3125 + 1.15625 ref : 1.1456439237389599572
		//	01001011 01000101 + 1.34375 + 1.15625 ref : 1.1592023119369629924
		//	01001100 01000110 + 1.375 + 1.1875 ref : 1.1726039399558574328
		//	01001101 01000110 + 1.40625 + 1.1875 ref : 1.1858541225631422655
		//	01001110 01000110 + 1.4375 + 1.1875 ref : 1.1989578808281797784
		//	01001111 01000111 + 1.46875 + 1.21875 ref : 1.2119199643540823352
		//	01010000 01000111 + 1.5 + 1.21875 ref : 1.2247448713915889407
		//	01010001 01001000 + 1.53125 + 1.25 ref : 1.237436867076458169
		//	01010010 01001000 + 1.5625 + 1.25 ref : 1.25
		//	01010011 01001000 + 1.59375 + 1.25 ref : 1.2624381172952596764
		//	01010100 01001001 + 1.625 + 1.28125 ref : 1.2747548783981961229
		//	01010101 01001001 + 1.65625 + 1.28125 ref : 1.2869537676233751
		//	01010110 01001010 + 1.6875 + 1.3125 ref : 1.2990381056766580059
		//	01010111 01001010 + 1.71875 + 1.3125 ref : 1.3110110602126894275
		//	01011000 01001010 + 1.75 + 1.3125 ref : 1.3228756555322953581
		//	01011001 01001011 + 1.78125 + 1.34375 ref : 1.3346347815039139029
		//	01011010 01001011 + 1.8125 + 1.34375 ref : 1.3462912017836259349
		//	01011011 01001011 + 1.84375 + 1.34375 ref : 1.3578475614000269367
		//	01011100 01001100 + 1.875 + 1.375 ref : 1.3693063937629152971
		//	01011101 01001100 + 1.90625 + 1.375 ref : 1.3806701271484076443
		//	01011110 01001101 + 1.9375 + 1.40625 ref : 1.3919410907075053796
		//	01011111 01001101 + 1.96875 + 1.40625 ref : 1.4031215200402280541
		//	01100000 01001101 + 2 + 1.40625 ref : 1.4142135623730951455
		//	01100001 01001111 + 2.125 + 1.46875 ref : 1.4577379737113251856
		//	01100010 01010000 + 2.25 + 1.5 ref : 1.5
		//	01100011 01010001 + 2.375 + 1.53125 ref : 1.5411035007422440035
		//	01100100 01010011 + 2.5 + 1.59375 ref : 1.5811388300841897614
		//	01100101 01010100 + 2.625 + 1.625 ref : 1.6201851746019650946
		//	01100110 01010101 + 2.75 + 1.65625 ref : 1.658312395177699905
		//	01100111 01010110 + 2.875 + 1.6875 ref : 1.6955824957813170339
		//	01101000 01010111 + 3 + 1.71875 ref : 1.7320508075688771932
		//	01101001 01011001 + 3.125 + 1.78125 ref : 1.7677669529663688763
		//	01101010 01011010 + 3.25 + 1.8125 ref : 1.8027756377319945624
		//	01101011 01011011 + 3.375 + 1.84375 ref : 1.837117307087383633
		//	01101100 01011100 + 3.5 + 1.875 ref : 1.8708286933869706647
		//	01101101 01011101 + 3.625 + 1.90625 ref : 1.9039432764659771635
		//	01101110 01011110 + 3.75 + 1.9375 ref : 1.9364916731037085107
		//	01101111 01011111 + 3.875 + 1.96875 ref : 1.9685019685029527814
		//	01110000 01100000 + 4 + 2 ref : 2
		//	01110001 01100001 + 4.5 + 2.125 ref : 2.1213203435596423851
		//	01110010 01100010 + 5 + 2.25 ref : 2.2360679774997898051
		//	01110011 01100011 + 5.5 + 2.375 ref : 2.3452078799117148655
		//	01110100 01100100 + 6 + 2.5 ref : 2.4494897427831778813
		//	01110101 01100100 + 6.5 + 2.5 ref : 2.5495097567963922458
		//	01110110 01100101 + 7 + 2.625 ref : 2.6457513110645907162
		//	01110111 01100110 + 7.5 + 2.75 ref : 2.7386127875258305941
		//	01111000 01100111 + 8 + 2.875 ref : 2.8284271247461902909
		//	01111001 01101001 + 10 + 3.125 ref : 3.1622776601683795228
		//	01111010 01101100 + 12 + 3.5 ref : 3.4641016151377543864
		//	01111011 01101110 + 14 + 3.75 ref : 3.7416573867739413295
		//	01111100 01110000 + 16 + 4 ref : 4
		//	01111101 01110010 + 24 + 5 ref : 4.8989794855663557627
		//	01111110 01110011 + 32 + 5.5 ref : 5.6568542494923805819
		//	01111111 01111000 + 64 + 8 ref : 8
		constexpr unsigned posit_8_0_roots[128] = {
			0x00, 0x08, 0x0B, 0x0E, 0x10, 0x12, 0x14, 0x15,
			0x17, 0x18, 0x19, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
			0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x26,
			0x27, 0x28, 0x29, 0x2A, 0x2A, 0x2B, 0x2C, 0x2D,
			0x2D, 0x2E, 0x2F, 0x2F, 0x30, 0x31, 0x31, 0x32,
			0x33, 0x33, 0x34, 0x34, 0x35, 0x36, 0x36, 0x37,
			0x37, 0x38, 0x39, 0x39, 0x3A, 0x3A, 0x3B, 0x3B,
			0x3C, 0x3C, 0x3D, 0x3D, 0x3E, 0x3E, 0x3F, 0x3F,
			0x40, 0x40, 0x41, 0x41, 0x42, 0x42, 0x43, 0x43,
			0x44, 0x44, 0x45, 0x45, 0x46, 0x46, 0x46, 0x47,
			0x47, 0x48, 0x48, 0x48, 0x49, 0x49, 0x4A, 0x4A,
			0x4A, 0x4B, 0x4B, 0x4B, 0x4C, 0x4C, 0x4D, 0x4D,
			0x4D, 0x4F, 0x50, 0x51, 0x53, 0x54, 0x55, 0x56,
			0x57, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F,
			0x60, 0x61, 0x62, 0x63, 0x64, 0x64, 0x65, 0x66,
			0x67, 0x69, 0x6C, 0x6E, 0x70, 0x72, 0x73, 0x78
		};
		template<>
		inline posit<8, 0> sqrt(const posit<8, 0>& a) {
			posit<8, 0> p;
			if (a.isneg() || a.isnar()) {
				p.setnar();
				return p;
			}
			unsigned root = posit_8_0_roots[a.encoding()];
			p.set_raw_bits(root);
			return p;
		}

	}  // namespace unum

}  // namespace sw
{'fraction_non_alphanumeric': 0.12346859287585865, 'fraction_numerical': 0.4902627292684654, 'mean_word_length': 2.5211320284253835, 'pattern_counts': {'":': 0, '<': 113, '<?xml version=': 0, '>': 59, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 8, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '1837949', 'n_tokens_mistral': 22256, 'n_tokens_neox': 12705, 'n_words': 2841}