$ /* $ Shader test script. $ $ Author: Michal Krol $ $ Comment line starts with dollar sign and white space. $ $ $program starts a new test program section called . Contains all other sections. $ $ $attrib starts vertex data input section for attrib called . Each line consists of $ four values that form single vertex attrib. $ $ $vertex starts vertex shader section. Contains $code and &output sections. $ $ $code starts source code section. All text in this section gets compiled into appropriate $ shader object. $ $ $output starts shader execution results section. These are compared, value-by-value, $ with results of executing printMESA() functions within a shader. $ */ $ /* $ -------------------------------------------------------------------------------------------------- $ Test printMESA() function. $ */ $program PRINT TEST $vertex $code #version 110 #extension MESA_shader_debug: require void main () { gl_Position = gl_ModelViewMatrix * gl_Vertex; gl_FrontColor = vec4 (1.0); printMESA (11.1); printMESA (111); printMESA (true); printMESA (vec2 (22.1, 22.2)); printMESA (vec3 (33.1, 33.2, 33.3)); printMESA (vec4 (44.1, 44.2, 44.3, 44.4)); printMESA (ivec2 (221, 222)); printMESA (ivec3 (331, 332, 333)); printMESA (ivec4 (441, 442, 443, 444)); printMESA (bvec2 (false, true)); printMESA (bvec3 (true, true, false)); printMESA (bvec4 (true, false, true, false)); printMESA (mat2 (55.11, 55.12, 55.21, 55.22)); printMESA (mat3 (66.11, 66.12, 66.13, 66.21, 66.22, 66.23, 66.31, 66.32, 66.33)); printMESA (mat4 (77.11, 77.12, 77.13, 77.14, 77.21, 77.22, 77.23, 77.24, 77.31, 77.32, 77.33, 77.34, 77.41, 77.42, 77.43, 77.44)); } $output 11.1 111 true 22.1 22.2 33.1 33.2 33.3 44.1 44.2 44.3 44.4 221 222 331 332 333 441 442 443 444 false true true true false true false true false 55.11 55.12 55.21 55.22 66.11 66.12 66.13 66.21 66.22 66.23 66.31 66.32 66.33 77.11 77.12 77.13 77.14 77.21 77.22 77.23 77.24 77.31 77.32 77.33 77.34 77.41 77.42 77.43 77.44 $ /* $ -------------------------------------------------------------------------------------------------- $ Test type casting. $ */ $program TYPE CAST TEST $attrib gl_Vertex 0.0 0.0 0.0 1.0 $attrib _Zero 0.0 0.0 0.0 0.0 $attrib _One 1.1 0.0 0.0 0.0 $attrib _Two 2.2 0.0 0.0 0.0 $attrib _MinusThree -3.3 0.0 0.0 0.0 $vertex $code #version 110 #extension MESA_shader_debug: require attribute float _Zero; attribute float _One; attribute float _Two; attribute float _MinusThree; void main () { gl_Position = gl_ModelViewMatrix * gl_Vertex; gl_FrontColor = vec4 (1.0); printMESA (_Zero); printMESA (_One); printMESA (_Two); printMESA (_MinusThree); printMESA (float (_Zero)); printMESA (float (_One)); printMESA (float (_Two)); printMESA (float (_MinusThree)); printMESA (float (45.99)); printMESA (float (-6.17)); printMESA (bool (_Zero)); printMESA (bool (_One)); printMESA (bool (_Two)); printMESA (bool (_MinusThree)); printMESA (bool (45.99)); printMESA (bool (-6.17)); printMESA (bool (0.0001)); printMESA (bool (0.0)); printMESA (int (_Zero)); printMESA (int (_One)); printMESA (int (_Two)); printMESA (int (_MinusThree)); printMESA (int (45.99)); printMESA (int (45.22)); printMESA (int (-6.17)); printMESA (int (-6.87)); } $output 0.0 1.1 2.2 -3.3 0.0 1.1 2.2 -3.3 45.99 -6.17 false true true true true true true false 0 1 2 -3 45 45 -6 -6 $ /* $ -------------------------------------------------------------------------------------------------- $ Test vector swizzles. $ */ $program SWIZZLE TEST $attrib gl_Vertex 0.0 0.0 0.0 1.0 $attrib _One 1.1 1.2 1.3 1.4 $attrib _Two 2.1 2.2 2.3 2.4 $vertex $code #version 110 #extension MESA_shader_debug: require attribute vec4 _One; attribute vec4 _Two; void assign5678 (out vec4 v) { v.x = 5.5; v.y = 6.6; v.z = 7.7; v.w = 8.8; } void main () { gl_Position = gl_ModelViewMatrix * gl_Vertex; gl_FrontColor = vec4 (1.0); printMESA (_One); printMESA (_Two); printMESA (_One.x); printMESA (_One.y); printMESA (_One.z); printMESA (_One.w); printMESA (_Two.xy); printMESA (_Two.yx); printMESA (_Two.xw); printMESA (_Two.wx); printMESA (_Two.yz); printMESA (_Two.zy); printMESA (_Two.xz); printMESA (_Two.zx); printMESA (_Two.zw); printMESA (_Two.wz); printMESA (_One.xyz); printMESA (_One.yzx); printMESA (_One.zxy); printMESA (_One.xzy); printMESA (_One.yzw); printMESA (_One.zwx); printMESA (_Two.xyzw); printMESA (_Two.yzwx); printMESA (_Two.wzyx); printMESA (_Two.zwyx); printMESA (_One.xx); printMESA (_One.zz); printMESA (_One.ww); printMESA (_Two.xxx); printMESA (_Two.yyy); printMESA (_Two.www); printMESA (_One.xxxx); printMESA (_One.zzzz); printMESA (_Two.xxyy); printMESA (_Two.wwxx); printMESA (_Two.zxxw); vec4 v; v.zxwy = vec4 (5.5, 6.6, 7.7, 8.8); printMESA (v); assign5678 (v.ywxz); printMESA (v); } $output 1.1 1.2 1.3 1.4 2.1 2.2 2.3 2.4 1.1 1.2 1.3 1.4 2.1 2.2 2.2 2.1 2.1 2.4 2.4 2.1 2.2 2.3 2.3 2.2 2.1 2.3 2.3 2.1 2.3 2.4 2.4 2.3 1.1 1.2 1.3 1.2 1.3 1.1 1.3 1.1 1.2 1.1 1.3 1.2 1.2 1.3 1.4 1.3 1.4 1.1 2.1 2.2 2.3 2.4 2.2 2.3 2.4 2.1 2.4 2.3 2.2 2.1 2.3 2.4 2.2 2.1 1.1 1.1 1.3 1.3 1.4 1.4 2.1 2.1 2.1 2.2 2.2 2.2 2.4 2.4 2.4 1.1 1.1 1.1 1.1 1.3 1.3 1.3 1.3 2.1 2.1 2.2 2.2 2.4 2.4 2.1 2.1 2.3 2.1 2.1 2.4 6.6 8.8 5.5 7.7 7.7 5.5 8.8 6.6 $ /* $ -------------------------------------------------------------------------------------------------- $ Test relational operators. $ */ $program RELATIONAL OPERATOR TEST $attrib gl_Vertex 0.0 0.0 0.0 1.0 $attrib _Two 2.0 0.0 0.0 0.0 $attrib _Two2 2.0 0.0 0.0 0.0 $attrib _MinusThree -3.0 0.0 0.0 0.0 $vertex $code #version 110 #extension MESA_shader_debug: require attribute float _Two; attribute float _Two2; attribute float _MinusThree; struct foo { float f; vec4 v4; vec3 v3; mat4 m4; int i; bool b; }; void printMESA (const in foo bar) { printMESA (bar.f); printMESA (bar.v4); printMESA (bar.v3); printMESA (bar.m4); printMESA (bar.i); printMESA (bar.b); } void main () { gl_Position = gl_ModelViewMatrix * gl_Vertex; gl_FrontColor = vec4 (1.0); int iTwo = int (_Two); int iTwo2 = int (_Two2); int iMinusThree = int (_MinusThree); printMESA (_Two <= _Two); printMESA (_Two <= _Two2); printMESA (_Two <= _MinusThree); printMESA (_MinusThree <= _Two); printMESA (iTwo <= iTwo); printMESA (iTwo <= iTwo2); printMESA (iTwo <= iMinusThree); printMESA (iMinusThree <= iTwo); printMESA (_Two >= _Two); printMESA (_Two >= _Two2); printMESA (_Two >= _MinusThree); printMESA (_MinusThree >= _Two); printMESA (iTwo >= iTwo); printMESA (iTwo >= iTwo2); printMESA (iTwo >= iMinusThree); printMESA (iMinusThree >= iTwo); printMESA (_Two < _Two); printMESA (_Two < _Two2); printMESA (_Two < _MinusThree); printMESA (_MinusThree < _Two); printMESA (iTwo < iTwo); printMESA (iTwo < iTwo2); printMESA (iTwo < iMinusThree); printMESA (iMinusThree < iTwo); printMESA (_Two > _Two); printMESA (_Two > _Two2); printMESA (_Two > _MinusThree); printMESA (_MinusThree > _Two); printMESA (iTwo > iTwo); printMESA (iTwo > iTwo2); printMESA (iTwo > iMinusThree); printMESA (iMinusThree > iTwo); printMESA (_Two == _Two); printMESA (_Two == _Two2); printMESA (_Two == _MinusThree); printMESA (_MinusThree == _MinusThree); printMESA (iTwo == iTwo); printMESA (iTwo == iTwo2); printMESA (iTwo == iMinusThree); printMESA (iMinusThree == iMinusThree); printMESA (_Two != _Two); printMESA (_Two != _Two2); printMESA (_Two != _MinusThree); printMESA (_MinusThree != _MinusThree); printMESA (iTwo != iTwo); printMESA (iTwo != iTwo2); printMESA (iTwo != iMinusThree); printMESA (iMinusThree != iMinusThree); foo foo1; foo1.f = 13.31; foo1.v4 = vec4 (44.11, 44.22, 44.33, 44.44); foo1.v3 = vec3 (33.11, 33.22, 33.33); foo1.m4 = mat4 (17.88); foo1.i = 666; foo1.b = true; printMESA (foo1); // make foo2 the same as foo1 foo foo2; foo2.f = 13.31; foo2.v4 = vec4 (44.11, 44.22, 44.33, 44.44); foo2.v3 = vec3 (33.11, 33.22, 33.33); foo2.m4 = mat4 (17.88); foo2.i = 666; foo2.b = true; printMESA (foo1 == foo2); printMESA (foo1 != foo2); // make them a little bit different foo2.m4[2].y = 333.333; printMESA (foo2); printMESA (foo1 == foo2); printMESA (foo1 != foo2); } $output true true false true true true false true true true true false true true true false false false false true false false false true false false true false false false true false true true false true true true false true false false true false false false true false 13.31 44.11 44.22 44.33 44.44 33.11 33.22 33.33 17.88 0.0 0.0 0.0 0.0 17.88 0.0 0.0 0.0 0.0 17.88 0.0 0.0 0.0 0.0 17.88 666 true true false 13.31 44.11 44.22 44.33 44.44 33.11 33.22 33.33 17.88 0.0 0.0 0.0 0.0 17.88 0.0 0.0 0.0 333.333 17.88 0.0 0.0 0.0 0.0 17.88 666 true false true $ /* $ -------------------------------------------------------------------------------------------------- $ Test logical operators. $ */ $program LOGICAL OPERATOR TEST $attrib gl_Vertex 0.0 0.0 0.0 1.0 $attrib _False 0.0 0.0 0.0 0.0 $attrib _True 1.0 0.0 0.0 0.0 $attrib _False2 0.0 0.0 0.0 0.0 $attrib _True2 1.0 0.0 0.0 0.0 $vertex $code #version 110 #extension MESA_shader_debug: require attribute float _False; attribute float _True; attribute float _False2; attribute float _True2; void main () { gl_Position = gl_ModelViewMatrix * gl_Vertex; gl_FrontColor = vec4 (1.0); printMESA (_False); printMESA (_True); printMESA (_False2); printMESA (_True2); bool False = bool (_False); bool True = bool (_True); bool False2 = bool (_False2); bool True2 = bool (_True2); // // It is important to test each operator with the following argument types: // * Both arguments are different variables, even if they have the same values. // False and False2 are distinct attributes, but are the same in value. // * Both arguments may be the same variables. This case tests possible // optimizations, e.g. X && X --> X. // * Both arguments are constant. This tests constant folding. // printMESA (!False); printMESA (!True); printMESA (!false); printMESA (!true); printMESA (False ^^ False2); printMESA (False ^^ True2); printMESA (True ^^ False2); printMESA (True ^^ True2); printMESA (False ^^ False); printMESA (False ^^ True); printMESA (True ^^ False); printMESA (True ^^ True); printMESA (false ^^ false); printMESA (false ^^ true); printMESA (true ^^ false); printMESA (true ^^ true); printMESA (False && False2); printMESA (False && True2); printMESA (True && False2); printMESA (True && True2); printMESA (False && False); printMESA (False && True); printMESA (True && False); printMESA (True && True); printMESA (false && false); printMESA (false && true); printMESA (true && false); printMESA (true && true); printMESA (False || False2); printMESA (False || True2); printMESA (True || False2); printMESA (True || True2); printMESA (False || False); printMESA (False || True); printMESA (True || False); printMESA (True || True); printMESA (false || false); printMESA (false || true); printMESA (true || false); printMESA (true || true); // // Test short-circuit evaluation of && and ||. The right expression evaluation depends // on the value of the left expression. If the right expression has side effects, we // can easily test if it happened. // bool x; x = false; printMESA (x); printMESA (False && (x = true)); printMESA (x); x = false; printMESA (x); printMESA (false && (x = true)); printMESA (x); x = true; printMESA (x); printMESA (True || (x = false)); printMESA (x); x = true; printMESA (x); printMESA (true || (x = false)); printMESA (x); } $output 0.0 1.0 0.0 1.0 true false true false false true true false false true true false false true true false false false false true false false false true false false false true false true true true false true true true false true true true false false false false false false true true true true true true $ /* $ -------------------------------------------------------------------------------------------------- $ Test subscript operator/array access. $ */ $program ARRAY ACCESS TEST $attrib gl_Vertex 0.0 0.0 0.0 1.0 $attrib _Zero 0.0 0.0 0.0 0.0 $attrib _One 1.1 0.0 0.0 0.0 $attrib _Two 2.9 0.0 0.0 0.0 $attrib _Vec 11.11 22.22 33.33 44.44 $vertex $code #version 110 #extension MESA_shader_debug: require attribute float _Zero; attribute float _One; attribute float _Two; attribute vec4 _Vec; void main () { gl_Position = gl_ModelViewMatrix * gl_Vertex; gl_FrontColor = vec4 (1.0); printMESA (_Zero); printMESA (_One); printMESA (_Two); printMESA (_Vec); printMESA (_Vec[0]); printMESA (_Vec[1]); printMESA (_Vec[2]); printMESA (_Vec[3]); printMESA (_Vec[int (_Zero)]); printMESA (_Vec[int (_One)]); printMESA (_Vec[int (_Two)]); } $output 0.0 1.1 2.9 11.11 22.22 33.33 44.44 11.11 22.22 33.33 44.44 11.11 22.22 33.33 $ /* $ -------------------------------------------------------------------------------------------------- $ Test pre/post-increment/decrement operators. $ Note: assumes relational operators being correct. $ */ $program PRE/POST-INC/DEC OPERATOR TEST $attrib gl_Vertex 0.0 0.0 0.0 1.0 $attrib _Zero 0.0 0.0 0.0 0.0 $attrib _One 1.1 0.0 0.0 0.0 $attrib _Two4 2.1 2.2 2.3 2.4 $vertex $code #version 110 #extension MESA_shader_debug: require attribute float _Zero; attribute float _One; attribute vec4 _Two4; float fZero, fOne; vec4 fTwo4; int iZero, iOne; ivec4 iTwo4; void reset () { fZero = _Zero; fOne = _One; fTwo4 = _Two4; iZero = int (_Zero); iOne = int (_One); iTwo4 = ivec4 (_Two4); } void main () { gl_Position = gl_ModelViewMatrix * gl_Vertex; gl_FrontColor = vec4 (1.0); printMESA (_Zero); printMESA (_One); printMESA (_Two4); // pre-increment reset (); printMESA (++fZero); printMESA (++fOne); printMESA (++iZero); printMESA (++iOne); printMESA (fZero); printMESA (fOne); printMESA (iZero); printMESA (iOne); printMESA (++fTwo4 == _Two4 + 1.0); printMESA (++iTwo4 == ivec4 (_Two4) + 1); // pre-decrement reset (); printMESA (--fZero); printMESA (--fOne); printMESA (--iZero); printMESA (--iOne); printMESA (fZero); printMESA (fOne); printMESA (iZero); printMESA (iOne); printMESA (--fTwo4 == _Two4 - 1.0); printMESA (--iTwo4 == ivec4 (_Two4) - 1); // post-increment reset (); printMESA (fZero++); printMESA (fOne++); printMESA (iZero++); printMESA (iOne++); printMESA (fZero); printMESA (fOne); printMESA (iZero); printMESA (iOne); printMESA (fTwo4++ == _Two4); printMESA (iTwo4++ == ivec4 (_Two4)); // post-decrement reset (); printMESA (fZero--); printMESA (fOne--); printMESA (iZero--); printMESA (iOne--); printMESA (fZero); printMESA (fOne); printMESA (iZero); printMESA (iOne); printMESA (fTwo4-- == _Two4); printMESA (iTwo4-- == ivec4 (_Two4)); } $output 0.0 1.1 2.1 2.2 2.3 2.4 1.0 2.1 1 2 1.0 2.1 1 2 true true -1.0 0.1 -1 0 -1.0 0.1 -1 0 true true 0.0 1.1 0 1 1.0 2.1 1 2 true true 0.0 1.1 0 1 -1.0 0.1 -1 0 true true $ /* $ -------------------------------------------------------------------------------------------------- $ Test arithmetical operators. $ */ $program ARITHMETICAL OPERATOR TEST $attrib gl_Vertex 0.0 0.0 0.0 1.0 $attrib _Zero 0.0 0.0 0.0 0.0 $attrib _One 1.1 0.0 0.0 0.0 $attrib _Two4 2.1 2.2 2.3 2.4 $vertex $code #version 110 #extension MESA_shader_debug: require attribute float _Zero; attribute float _One; attribute vec4 _Two4; void main () { gl_Position = gl_ModelViewMatrix * gl_Vertex; gl_FrontColor = vec4 (1.0); printMESA (_Zero); printMESA (_One); printMESA (_Two4); int iZero = int (_Zero); int iOne = int (_One); ivec4 iTwo4 = ivec4 (_Two4); printMESA (-_Zero); printMESA (-_One); printMESA (-_Two4); printMESA (-_Two4.z); printMESA (_Zero + 0.0); printMESA (_One + 0.0); printMESA (_Two4 + 0.0); printMESA (_Two4.y + 0.0); printMESA (_Zero + _Zero); printMESA (_Zero + _One); printMESA (_Zero + _Two4); printMESA (_One + _Zero); printMESA (_One + _Two4); printMESA (_Two4 + _Two4); printMESA (_Zero - 0.0); printMESA (_One - 0.0); printMESA (_Two4 - 0.0); printMESA (_Two4.y - 0.0); printMESA (_Zero - _Zero); printMESA (_Zero - _One); printMESA (_Zero - _Two4); printMESA (_One - _Zero); printMESA (_One - _Two4); printMESA (_Two4 - _Two4); printMESA (_Zero * 1.0); printMESA (_One * 1.0); printMESA (_Two4 * 1.0); printMESA (_Two4.x * 1.0); printMESA (_Zero * _Zero); printMESA (_Zero * _One); printMESA (_Zero * _Two4); printMESA (_One * _Zero); printMESA (_One * _One); printMESA (_One * _Two4); printMESA (_Two4 * _Two4); printMESA (_Zero / 1.0); printMESA (_One / 1.0); printMESA (_Two4 / 1.0); printMESA (_Two4.x / 1.0); printMESA (_Zero / _One); printMESA (_Zero / _Two4); printMESA (_One / _One); printMESA (_One / _Two4); printMESA (_Two4 / _Two4); } $output 0.0 1.1 2.1 2.2 2.3 2.4 0.0 -1.1 -2.1 -2.2 -2.3 -2.4 -2.3 0.0 1.1 2.1 2.2 2.3 2.4 2.2 0.0 1.1 2.1 2.2 2.3 2.4 1.1 3.2 3.3 3.4 3.5 4.2 4.4 4.6 4.8 0.0 1.1 2.1 2.2 2.3 2.4 2.2 0.0 -1.1 -2.1 -2.2 -2.3 -2.4 1.1 -1.0 -1.1 -1.2 -1.3 0.0 0.0 0.0 0.0 0.0 1.1 2.1 2.2 2.3 2.4 2.1 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.21 2.31 2.42 2.53 2.64 4.41 4.84 5.29 5.76 0.0 1.1 2.1 2.2 2.3 2.4 2.1 0.0 0.0 0.0 0.0 0.0 1.0 0.52381 0.5 0.47826 0.45833 1.0 1.0 1.0 1.0 $ /* $ -------------------------------------------------------------------------------------------------- $ Test matrix operations. $ Note: assumes relational operators being correct. $ */ $program MATRIX TEST $attrib gl_Vertex 0.0 0.0 0.0 1.0 $attrib _Zero 0.0 0.0 0.0 0.0 $attrib _One 1.0 1.0 1.0 1.0 $attrib _Two 2.0 2.0 2.0 2.0 $vertex $code #version 110 #extension MESA_shader_debug: require attribute vec4 _Zero; attribute vec4 _One; attribute vec4 _Two; void main () { gl_Position = gl_ModelViewMatrix * gl_Vertex; gl_FrontColor = vec4 (1.0); printMESA (_Zero); printMESA (_One); printMESA (_Two); mat4 Identity = mat4 (_One.x); printMESA (Identity == mat4 (1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0)); printMESA (Identity * _Two == _Two); mat4 Matrix = mat4 (1.1, 1.2, 1.3, 1.4, 2.1, 2.2, 2.3, 2.4, 3.1, 3.2, 3.3, 3.4, 4.1, 4.2, 4.3, 4.4); printMESA (Matrix[2].y); printMESA (Matrix[1]); } $output 0.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0 2.0 2.0 2.0 2.0 true true 3.2 2.1 2.2 2.3 2.4 $ /* $ -------------------------------------------------------------------------------------------------- $ Test vec4 extension operations. $ */ $program VEC4 EXTENSION OPERATIONS $attrib gl_Vertex 0.0 0.0 0.0 1.0 $attrib _One 1.1 0.0 0.0 0.0 $attrib _Two4 2.1 2.2 2.3 2.4 $attrib _Three4 3.1 3.2 3.3 3.4 $vertex $code #version 110 #extension MESA_shader_debug: require attribute float _One; attribute vec4 _Two4; attribute vec4 _Three4; void main () { gl_Position = gl_ModelViewMatrix * gl_Vertex; gl_FrontColor = vec4 (1.0); printMESA (_One); printMESA (_Two4); printMESA (_Three4); printMESA (vec4 (_One)); printMESA (_Two4 + _Three4); printMESA (_Two4 - _Three4); printMESA (_Two4 * _Three4); printMESA (_Two4 / _Three4); printMESA (_Two4 + _One); printMESA (_Two4 - _One); printMESA (_Two4 * _One); printMESA (_Two4 / _One); printMESA (_One + _Two4); printMESA (_One - _Two4); printMESA (_One * _Two4); printMESA (_One / _Two4); printMESA (-_Three4); printMESA (dot (_Two4.xyz, _Three4.xyz)); printMESA (dot (_Two4, _Three4)); printMESA (length (_Two4.xyz)); printMESA (length (_Three4)); printMESA (normalize (_Two4.xyz)); printMESA (normalize (_Three4)); vec4 tmp = _Two4; printMESA (tmp); printMESA (_Two4 == _Three4); printMESA (_Two4 != _Three4); printMESA (_Two4 == _Two4); printMESA (_Three4 != _Three4); printMESA (_Two4 != vec4 (_Two4.xyz, 999.0)); printMESA (_Two4 != vec4 (999.0, _Two4.yzw)); } $output 1.1 2.1 2.2 2.3 2.4 3.1 3.2 3.3 3.4 1.1 1.1 1.1 1.1 5.2 5.4 5.6 5.8 -1.0 -1.0 -1.0 -1.0 6.51 7.04 7.59 8.16 0.677419 0.6875 0.69697 0.705882 3.2 3.3 3.4 3.5 1.0 1.1 1.2 1.3 2.31 2.42 2.53 2.64 1.909091 2.0 2.090909 2.181818 3.2 3.3 3.4 3.5 -1.0 -1.1 -1.2 -1.3 2.31 2.42 2.53 2.64 0.52381 0.5 0.478261 0.458333 -3.1 -3.2 -3.3 -3.4 21.14 29.3 3.813135 6.503845 0.550728 0.576953 0.603178 0.476641 0.492017 0.507392 0.522768 2.1 2.2 2.3 2.4 false true true false true true