1################################################################ 2# 3# Licensed to the Apache Software Foundation (ASF) under one 4# or more contributor license agreements. See the NOTICE file 5# distributed with this work for additional information 6# regarding copyright ownership. The ASF licenses this file 7# to you under the Apache License, Version 2.0 (the 8# "License"); you may not use this file except in compliance 9# with the License. You may obtain a copy of the License at 10# 11# http://www.apache.org/licenses/LICENSE-2.0 12# 13# Unless required by applicable law or agreed to in writing, 14# software distributed under the License is distributed on an 15# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16# KIND, either express or implied. See the License for the 17# specific language governing permissions and limitations 18# under the License. 19# 20################################################################ 21 22# calcval cases for calcval.py. Columns (tab separated): id, formula, mode, expected, note. 23# formula: AOO API syntax (English function names, ';' separators, '|' row separator in inline arrays), leading '='. 24# mode: cell | cell@N (plain cell, scratch cell AA<N>; default AA1) | array[:CxR] (setArrayFormula on AA1 sized C columns x R rows; default 1x1). 25# expected: '-' = record only; number (relative tolerance 1e-9; '~' prefix = 1e-6); '#N/A'; '#ERR' (any error); 's:text'; for array modes a '|' separated row-major list of those. 26# RECEIVED, BESSELK, BESSELY are Analysis add-in functions: calcval.py rewrites them to their programmatic names. 27# Expected values come from the public ODF 1.3 Part 4 text (OpenDocument-v1.3-os-part4-formula). 28# 29# Data written by calcval.py on sheet 1 (second sheet is named Other): 30# A1:A9 y,x,x,y,x,y,x,x,y B1:B9 y,x,y,y,y,y,x,y,x 31# D1:F5 D=10,20,30,40,50 E=11,22,33,44,55 F=101,202,303,404,505 32# H1:L3 row1 10,20,30,40,50 row2 11,22,33,44,55 row3 101,202,303,404,505 33# N1:N6 3,5,8,9,13,14 (y) O1:O6 1..6 (x) P1:P6 2,4,7,15,30,58 (positive y) 34# R1:T6 database: header Name,Age,Score; A,20,5; B,30,"n/a"; C,40,15; D,50,(empty); E,60,25 35# V1:V2 criteria Age,">=30" W1:W2 criteria Age,(empty) Y1:Y2 criteria Name,"A" 36# AH1:AH11 6,6,6,6,3,2,1,2,6,4,2 (variance 4.2) AI1:AI3 1,3,5 (variance 4) 37# AJ1:AJ4 and AK1:AK4 2,4,7,9 38# Scratch area AA1:AF12 is cleared after every case. 39WEEKDAY.Sun.1 =WEEKDAY(DATE(2024;1;7);1) cell 1 Part 4 6.10.20 Table 6, Sunday type 1 40WEEKDAY.Sun.2 =WEEKDAY(DATE(2024;1;7);2) cell 7 Part 4 6.10.20 Table 6, Sunday type 2 41WEEKDAY.Sun.3 =WEEKDAY(DATE(2024;1;7);3) cell 6 Part 4 6.10.20 Table 6, Sunday type 3 42WEEKDAY.Sun.11 =WEEKDAY(DATE(2024;1;7);11) cell 7 Part 4 6.10.20 Table 6, Sunday type 11 43WEEKDAY.Sun.12 =WEEKDAY(DATE(2024;1;7);12) cell 6 Part 4 6.10.20 Table 6, Sunday type 12 44WEEKDAY.Sun.13 =WEEKDAY(DATE(2024;1;7);13) cell 5 Part 4 6.10.20 Table 6, Sunday type 13 45WEEKDAY.Sun.14 =WEEKDAY(DATE(2024;1;7);14) cell 4 Part 4 6.10.20 Table 6, Sunday type 14 46WEEKDAY.Sun.15 =WEEKDAY(DATE(2024;1;7);15) cell 3 Part 4 6.10.20 Table 6, Sunday type 15 47WEEKDAY.Sun.16 =WEEKDAY(DATE(2024;1;7);16) cell 2 Part 4 6.10.20 Table 6, Sunday type 16 48WEEKDAY.Sun.17 =WEEKDAY(DATE(2024;1;7);17) cell 1 Part 4 6.10.20 Table 6, Sunday type 17 49WEEKDAY.Mon.1 =WEEKDAY(DATE(2024;1;8);1) cell 2 Part 4 6.10.20 Table 6, Monday type 1 50WEEKDAY.Mon.2 =WEEKDAY(DATE(2024;1;8);2) cell 1 Part 4 6.10.20 Table 6, Monday type 2 51WEEKDAY.Mon.3 =WEEKDAY(DATE(2024;1;8);3) cell 0 Part 4 6.10.20 Table 6, Monday type 3 52WEEKDAY.Mon.11 =WEEKDAY(DATE(2024;1;8);11) cell 1 Part 4 6.10.20 Table 6, Monday type 11 53WEEKDAY.Mon.12 =WEEKDAY(DATE(2024;1;8);12) cell 7 Part 4 6.10.20 Table 6, Monday type 12 54WEEKDAY.Mon.13 =WEEKDAY(DATE(2024;1;8);13) cell 6 Part 4 6.10.20 Table 6, Monday type 13 55WEEKDAY.Mon.14 =WEEKDAY(DATE(2024;1;8);14) cell 5 Part 4 6.10.20 Table 6, Monday type 14 56WEEKDAY.Mon.15 =WEEKDAY(DATE(2024;1;8);15) cell 4 Part 4 6.10.20 Table 6, Monday type 15 57WEEKDAY.Mon.16 =WEEKDAY(DATE(2024;1;8);16) cell 3 Part 4 6.10.20 Table 6, Monday type 16 58WEEKDAY.Mon.17 =WEEKDAY(DATE(2024;1;8);17) cell 2 Part 4 6.10.20 Table 6, Monday type 17 59WEEKDAY.Tue.1 =WEEKDAY(DATE(2024;1;9);1) cell 3 Part 4 6.10.20 Table 6, Tuesday type 1 60WEEKDAY.Tue.2 =WEEKDAY(DATE(2024;1;9);2) cell 2 Part 4 6.10.20 Table 6, Tuesday type 2 61WEEKDAY.Tue.3 =WEEKDAY(DATE(2024;1;9);3) cell 1 Part 4 6.10.20 Table 6, Tuesday type 3 62WEEKDAY.Tue.11 =WEEKDAY(DATE(2024;1;9);11) cell 2 Part 4 6.10.20 Table 6, Tuesday type 11 63WEEKDAY.Tue.12 =WEEKDAY(DATE(2024;1;9);12) cell 1 Part 4 6.10.20 Table 6, Tuesday type 12 64WEEKDAY.Tue.13 =WEEKDAY(DATE(2024;1;9);13) cell 7 Part 4 6.10.20 Table 6, Tuesday type 13 65WEEKDAY.Tue.14 =WEEKDAY(DATE(2024;1;9);14) cell 6 Part 4 6.10.20 Table 6, Tuesday type 14 66WEEKDAY.Tue.15 =WEEKDAY(DATE(2024;1;9);15) cell 5 Part 4 6.10.20 Table 6, Tuesday type 15 67WEEKDAY.Tue.16 =WEEKDAY(DATE(2024;1;9);16) cell 4 Part 4 6.10.20 Table 6, Tuesday type 16 68WEEKDAY.Tue.17 =WEEKDAY(DATE(2024;1;9);17) cell 3 Part 4 6.10.20 Table 6, Tuesday type 17 69WEEKDAY.Wed.1 =WEEKDAY(DATE(2024;1;10);1) cell 4 Part 4 6.10.20 Table 6, Wednesday type 1 70WEEKDAY.Wed.2 =WEEKDAY(DATE(2024;1;10);2) cell 3 Part 4 6.10.20 Table 6, Wednesday type 2 71WEEKDAY.Wed.3 =WEEKDAY(DATE(2024;1;10);3) cell 2 Part 4 6.10.20 Table 6, Wednesday type 3 72WEEKDAY.Wed.11 =WEEKDAY(DATE(2024;1;10);11) cell 3 Part 4 6.10.20 Table 6, Wednesday type 11 73WEEKDAY.Wed.12 =WEEKDAY(DATE(2024;1;10);12) cell 2 Part 4 6.10.20 Table 6, Wednesday type 12 74WEEKDAY.Wed.13 =WEEKDAY(DATE(2024;1;10);13) cell 1 Part 4 6.10.20 Table 6, Wednesday type 13 75WEEKDAY.Wed.14 =WEEKDAY(DATE(2024;1;10);14) cell 7 Part 4 6.10.20 Table 6, Wednesday type 14 76WEEKDAY.Wed.15 =WEEKDAY(DATE(2024;1;10);15) cell 6 Part 4 6.10.20 Table 6, Wednesday type 15 77WEEKDAY.Wed.16 =WEEKDAY(DATE(2024;1;10);16) cell 5 Part 4 6.10.20 Table 6, Wednesday type 16 78WEEKDAY.Wed.17 =WEEKDAY(DATE(2024;1;10);17) cell 4 Part 4 6.10.20 Table 6, Wednesday type 17 79WEEKDAY.Thu.1 =WEEKDAY(DATE(2024;1;11);1) cell 5 Part 4 6.10.20 Table 6, Thursday type 1 80WEEKDAY.Thu.2 =WEEKDAY(DATE(2024;1;11);2) cell 4 Part 4 6.10.20 Table 6, Thursday type 2 81WEEKDAY.Thu.3 =WEEKDAY(DATE(2024;1;11);3) cell 3 Part 4 6.10.20 Table 6, Thursday type 3 82WEEKDAY.Thu.11 =WEEKDAY(DATE(2024;1;11);11) cell 4 Part 4 6.10.20 Table 6, Thursday type 11 83WEEKDAY.Thu.12 =WEEKDAY(DATE(2024;1;11);12) cell 3 Part 4 6.10.20 Table 6, Thursday type 12 84WEEKDAY.Thu.13 =WEEKDAY(DATE(2024;1;11);13) cell 2 Part 4 6.10.20 Table 6, Thursday type 13 85WEEKDAY.Thu.14 =WEEKDAY(DATE(2024;1;11);14) cell 1 Part 4 6.10.20 Table 6, Thursday type 14 86WEEKDAY.Thu.15 =WEEKDAY(DATE(2024;1;11);15) cell 7 Part 4 6.10.20 Table 6, Thursday type 15 87WEEKDAY.Thu.16 =WEEKDAY(DATE(2024;1;11);16) cell 6 Part 4 6.10.20 Table 6, Thursday type 16 88WEEKDAY.Thu.17 =WEEKDAY(DATE(2024;1;11);17) cell 5 Part 4 6.10.20 Table 6, Thursday type 17 89WEEKDAY.Fri.1 =WEEKDAY(DATE(2024;1;12);1) cell 6 Part 4 6.10.20 Table 6, Friday type 1 90WEEKDAY.Fri.2 =WEEKDAY(DATE(2024;1;12);2) cell 5 Part 4 6.10.20 Table 6, Friday type 2 91WEEKDAY.Fri.3 =WEEKDAY(DATE(2024;1;12);3) cell 4 Part 4 6.10.20 Table 6, Friday type 3 92WEEKDAY.Fri.11 =WEEKDAY(DATE(2024;1;12);11) cell 5 Part 4 6.10.20 Table 6, Friday type 11 93WEEKDAY.Fri.12 =WEEKDAY(DATE(2024;1;12);12) cell 4 Part 4 6.10.20 Table 6, Friday type 12 94WEEKDAY.Fri.13 =WEEKDAY(DATE(2024;1;12);13) cell 3 Part 4 6.10.20 Table 6, Friday type 13 95WEEKDAY.Fri.14 =WEEKDAY(DATE(2024;1;12);14) cell 2 Part 4 6.10.20 Table 6, Friday type 14 96WEEKDAY.Fri.15 =WEEKDAY(DATE(2024;1;12);15) cell 1 Part 4 6.10.20 Table 6, Friday type 15 97WEEKDAY.Fri.16 =WEEKDAY(DATE(2024;1;12);16) cell 7 Part 4 6.10.20 Table 6, Friday type 16 98WEEKDAY.Fri.17 =WEEKDAY(DATE(2024;1;12);17) cell 6 Part 4 6.10.20 Table 6, Friday type 17 99WEEKDAY.Sat.1 =WEEKDAY(DATE(2024;1;13);1) cell 7 Part 4 6.10.20 Table 6, Saturday type 1 100WEEKDAY.Sat.2 =WEEKDAY(DATE(2024;1;13);2) cell 6 Part 4 6.10.20 Table 6, Saturday type 2 101WEEKDAY.Sat.3 =WEEKDAY(DATE(2024;1;13);3) cell 5 Part 4 6.10.20 Table 6, Saturday type 3 102WEEKDAY.Sat.11 =WEEKDAY(DATE(2024;1;13);11) cell 6 Part 4 6.10.20 Table 6, Saturday type 11 103WEEKDAY.Sat.12 =WEEKDAY(DATE(2024;1;13);12) cell 5 Part 4 6.10.20 Table 6, Saturday type 12 104WEEKDAY.Sat.13 =WEEKDAY(DATE(2024;1;13);13) cell 4 Part 4 6.10.20 Table 6, Saturday type 13 105WEEKDAY.Sat.14 =WEEKDAY(DATE(2024;1;13);14) cell 3 Part 4 6.10.20 Table 6, Saturday type 14 106WEEKDAY.Sat.15 =WEEKDAY(DATE(2024;1;13);15) cell 2 Part 4 6.10.20 Table 6, Saturday type 15 107WEEKDAY.Sat.16 =WEEKDAY(DATE(2024;1;13);16) cell 1 Part 4 6.10.20 Table 6, Saturday type 16 108WEEKDAY.Sat.17 =WEEKDAY(DATE(2024;1;13);17) cell 7 Part 4 6.10.20 Table 6, Saturday type 17 109WEEKDAY.Wed.0 =WEEKDAY(DATE(2024;1;10);0) cell - type not listed in 1.3 Table 6; spec gives no value or error rule 110WEEKDAY.Wed.4 =WEEKDAY(DATE(2024;1;10);4) cell - type not listed in 1.3 Table 6; spec gives no value or error rule 111WEEKDAY.Wed.10 =WEEKDAY(DATE(2024;1;10);10) cell - type not listed in 1.3 Table 6; spec gives no value or error rule 112WEEKDAY.Wed.18 =WEEKDAY(DATE(2024;1;10);18) cell - type not listed in 1.3 Table 6; spec gives no value or error rule 113WEEKDAY.Wed.m1 =WEEKDAY(DATE(2024;1;10);-1) cell - type not listed in 1.3 Table 6; spec gives no value or error rule 114WEEKDAY.Wed.2p7 =WEEKDAY(DATE(2024;1;10);2.7) cell - non-integer Type; conversion to Integer is implementation-defined (6.3.6) 115WEEKDAY.Wed.default =WEEKDAY(DATE(2024;1;10)) cell 4 Type omitted defaults to 1 (6.10.20 syntax); Wednesday type 1 = 4 116WEEKDAY.Sat.default =WEEKDAY(DATE(2024;1;13)) cell 7 Type omitted defaults to 1; Saturday = 7 117RECEIVED.lt.12m =RECEIVED(DATE(2024;1;1);DATE(2025;1;1);1000;0.05) cell 1052.63157895 Investment/(1-Discount*YEARFRAC), basis 0 (30/360) YEARFRAC=1 118RECEIVED.lt.6m =RECEIVED(DATE(2024;1;1);DATE(2024;7;1);1000;0.05) cell 1025.64102564 basis 0 YEARFRAC=180/360=0.5 119RECEIVED.eq =RECEIVED(DATE(2024;1;1);DATE(2024;1;1);1000;0.05) cell - Settlement = Maturity violates constraint Settlement < Maturity; no value specified 120RECEIVED.gt =RECEIVED(DATE(2025;1;1);DATE(2024;1;1);1000;0.05) cell - Settlement > Maturity violates constraint Settlement < Maturity; no value specified 121DCOUNT.name.crit =DCOUNT(R1:T6;"Name";V1:V2) cell 0 Age>=30 matches 4 records; Name is text: COUNT 0, COUNTA 4 122DCOUNT.score.crit =DCOUNT(R1:T6;"Score";V1:V2) cell 2 Age>=30 records have Score n/a, 15, empty, 25: COUNT 2, COUNTA 3 123DCOUNT.namecase =DCOUNT(R1:T6;"score";V1:V2) cell 2 4.11.10: field names should match case-insensitively 124DCOUNT.idx.crit =DCOUNT(R1:T6;3;V1:V2) cell 2 4.11.10: Number field selects column 3 (Score) 125DCOUNT.zero.crit =DCOUNT(R1:T6;0;V1:V2) cell #ERR KNOWN DEVIATION, kept on purpose: 0 means the whole database in AOO (legacy, documented in its help); 4.11.10: Number field is a positive integer; field 0 does not exist, so Error 126DCOUNT.badfield =DCOUNT(R1:T6;9;V1:V2) cell #ERR 4.11.10: nonexistent field returns Error 127DCOUNT.badname =DCOUNT(R1:T6;"Nope";V1:V2) cell #ERR 4.11.10: nonexistent field name returns Error 128DCOUNT.omit.crit =DCOUNT(R1:T6;;V1:V2) cell 4 Field omitted: count of all records satisfying criteria (Age>=30 = 4) 129DCOUNT.omit.name =DCOUNT(R1:T6;;Y1:Y2) cell 1 Field omitted, criteria Name=A matches 1 record 130DCOUNT.two.param =DCOUNT(R1:T6;V1:V2) cell - syntax is D ; [F] ; C, separators required; the two-parameter form is not listed 131DCOUNT.emptycrit =DCOUNT(R1:T6;"Age";W1:W2) cell 0 KNOWN DEVIATION, kept on purpose: one reading of 4.11.11; AOO ignores empty criteria cells (documented in its help); 4.11.11: empty criterion cell is the numeric value 0; no record has Age 0 132DCOUNTA.name.crit =DCOUNTA(R1:T6;"Name";V1:V2) cell 4 Age>=30 matches 4 records; Name is text: COUNT 0, COUNTA 4 133DCOUNTA.score.crit =DCOUNTA(R1:T6;"Score";V1:V2) cell 3 Age>=30 records have Score n/a, 15, empty, 25: COUNT 2, COUNTA 3 134DCOUNTA.namecase =DCOUNTA(R1:T6;"score";V1:V2) cell 3 4.11.10: field names should match case-insensitively 135DCOUNTA.idx.crit =DCOUNTA(R1:T6;3;V1:V2) cell 3 4.11.10: Number field selects column 3 (Score) 136DCOUNTA.zero.crit =DCOUNTA(R1:T6;0;V1:V2) cell #ERR KNOWN DEVIATION, kept on purpose: 0 means the whole database in AOO (legacy, documented in its help); 4.11.10: Number field is a positive integer; field 0 does not exist, so Error 137DCOUNTA.badfield =DCOUNTA(R1:T6;9;V1:V2) cell #ERR 4.11.10: nonexistent field returns Error 138DCOUNTA.badname =DCOUNTA(R1:T6;"Nope";V1:V2) cell #ERR 4.11.10: nonexistent field name returns Error 139DCOUNTA.omit.crit =DCOUNTA(R1:T6;;V1:V2) cell 4 Field omitted: count of all records satisfying criteria (Age>=30 = 4) 140DCOUNTA.omit.name =DCOUNTA(R1:T6;;Y1:Y2) cell 1 Field omitted, criteria Name=A matches 1 record 141DCOUNTA.two.param =DCOUNTA(R1:T6;V1:V2) cell - syntax is D ; [F] ; C, separators required; the two-parameter form is not listed 142DCOUNTA.emptycrit =DCOUNTA(R1:T6;"Age";W1:W2) cell 0 KNOWN DEVIATION, kept on purpose: one reading of 4.11.11; AOO ignores empty criteria cells (documented in its help); 4.11.11: empty criterion cell is the numeric value 0; no record has Age 0 143IF.a.true =IF(1=1) cell 1 6.15.4: IfTrue is TRUE (case a); TRUE as number 1 144IF.a.false =IF(1=2) cell 0 6.15.4: IfFalse is FALSE (case a); FALSE as number 0 145IF.b.true =IF(1=1;) cell 0 6.15.4: IfTrue null is 0 (case b); TRUE as number 1 146IF.b.false =IF(1=2;) cell 0 6.15.4: IfFalse is FALSE with 2 parameters (case b); FALSE as number 0 147IF.c.true =IF(1=1;5) cell 5 6.15.4: IfTrue (case c); TRUE as number 1 148IF.c.false =IF(1=2;5) cell 0 6.15.4: IfFalse is FALSE with 2 parameters (case c); FALSE as number 0 149IF.d.true =IF(1=1;;) cell 0 6.15.4: IfTrue null is 0 (case d); TRUE as number 1 150IF.d.false =IF(1=2;;) cell 0 6.15.4: IfFalse null is 0 (case d); FALSE as number 0 151IF.e.true =IF(1=1;;7) cell 0 6.15.4: IfTrue null is 0 (case e); TRUE as number 1 152IF.e.false =IF(1=2;;7) cell 7 6.15.4: IfFalse (case e); FALSE as number 0 153IF.f.true =IF(1=1;5;) cell 5 6.15.4: IfTrue (case f); TRUE as number 1 154IF.f.false =IF(1=2;5;) cell 0 6.15.4: IfFalse null is 0 (case f); FALSE as number 0 155IF.g.true =IF(1=1;5;7) cell 5 6.15.4: IfTrue (case g); TRUE as number 1 156IF.g.false =IF(1=2;5;7) cell 7 6.15.4: IfFalse (case g); FALSE as number 0 157IF.text.true =IF(1=1;"a";"b") cell s:a control 158IF.text.false =IF(1=2;"a";"b") cell s:b control 159SYN.sum.control =SUM(1) cell 1 control 160SYN.sum.trail =SUM(1;) cell - compile behaviour only 161SYN.sum.lead =SUM(;1) cell - compile behaviour only 162SYN.sum.empty =SUM() cell - compile behaviour only 163SYN.sum.mid =SUM(1;;2) cell - compile behaviour only 164SYN.semi =(;) cell - compile behaviour only 165SYN.parens =() cell - compile behaviour only 166SYN.inline.trail ={1;} cell - compile behaviour only (inline array with empty element) 167SYN.sum.space =SUM (1) cell - whitespace before parenthesis; compile behaviour and read-back only 168VLOOKUP.range.exact.cell =VLOOKUP(30;D1:F5;2;0) cell 33 6.14.12 VLOOKUP exact, range source 169VLOOKUP.range.exact.arr =VLOOKUP(30;D1:F5;2;0) array 33 6.14.12 VLOOKUP exact, range source 170VLOOKUP.range.col3.cell =VLOOKUP(30;D1:F5;3;0) cell 303 6.14.12 VLOOKUP exact, third column 171VLOOKUP.range.col3.arr =VLOOKUP(30;D1:F5;3;0) array 303 6.14.12 VLOOKUP exact, third column 172VLOOKUP.range.sorted.cell =VLOOKUP(35;D1:F5;2) cell 33 6.14.12 VLOOKUP sorted: largest entry <= lookup 173VLOOKUP.range.sorted.arr =VLOOKUP(35;D1:F5;2) array 33 6.14.12 VLOOKUP sorted: largest entry <= lookup 174VLOOKUP.range.nomatch.cell =VLOOKUP(35;D1:F5;2;0) cell #N/A 6.14.12 VLOOKUP exact, no match is #N/A 175VLOOKUP.range.nomatch.arr =VLOOKUP(35;D1:F5;2;0) array #N/A 6.14.12 VLOOKUP exact, no match is #N/A 176VLOOKUP.range.below.cell =VLOOKUP(5;D1:F5;2) cell #N/A 6.14.12 VLOOKUP no data <= lookup is #N/A 177VLOOKUP.range.below.arr =VLOOKUP(5;D1:F5;2) array #N/A 6.14.12 VLOOKUP no data <= lookup is #N/A 178VLOOKUP.inline.exact.cell =VLOOKUP(30;{10;11|20;22|30;33};2;0) cell 33 6.14.12 VLOOKUP inline-array source 179VLOOKUP.inline.exact.arr =VLOOKUP(30;{10;11|20;22|30;33};2;0) array 33 6.14.12 VLOOKUP inline-array source 180VLOOKUP.inline.sorted.cell =VLOOKUP(35;{10;11|20;22|30;33|40;44};2) cell 33 6.14.12 VLOOKUP inline-array source, sorted 181VLOOKUP.inline.sorted.arr =VLOOKUP(35;{10;11|20;22|30;33|40;44};2) array 33 6.14.12 VLOOKUP inline-array source, sorted 182VLOOKUP.nested.exact.cell =VLOOKUP(30;D1:E5*1;2;0) cell 33 6.14.12 VLOOKUP nested-expression source (ForceArray) 183VLOOKUP.nested.exact.arr =VLOOKUP(30;D1:E5*1;2;0) array 33 6.14.12 VLOOKUP nested-expression source (ForceArray) 184HLOOKUP.range.exact.cell =HLOOKUP(30;H1:L3;2;0) cell 33 6.14.5 HLOOKUP exact, range source 185HLOOKUP.range.exact.arr =HLOOKUP(30;H1:L3;2;0) array 33 6.14.5 HLOOKUP exact, range source 186HLOOKUP.range.row3.cell =HLOOKUP(30;H1:L3;3;0) cell 303 6.14.5 HLOOKUP exact, third row 187HLOOKUP.range.row3.arr =HLOOKUP(30;H1:L3;3;0) array 303 6.14.5 HLOOKUP exact, third row 188HLOOKUP.range.sorted.cell =HLOOKUP(35;H1:L3;2) cell 33 6.14.5 HLOOKUP sorted: largest entry <= lookup 189HLOOKUP.range.sorted.arr =HLOOKUP(35;H1:L3;2) array 33 6.14.5 HLOOKUP sorted: largest entry <= lookup 190HLOOKUP.range.nomatch.cell =HLOOKUP(35;H1:L3;2;0) cell #N/A 6.14.5 HLOOKUP exact, no match is #N/A 191HLOOKUP.range.nomatch.arr =HLOOKUP(35;H1:L3;2;0) array #N/A 6.14.5 HLOOKUP exact, no match is #N/A 192HLOOKUP.inline.exact.cell =HLOOKUP(30;{10;20;30|11;22;33};2;0) cell 33 6.14.5 HLOOKUP inline-array source 193HLOOKUP.inline.exact.arr =HLOOKUP(30;{10;20;30|11;22;33};2;0) array 33 6.14.5 HLOOKUP inline-array source 194HLOOKUP.inline.sorted.cell =HLOOKUP(35;{10;20;30;40|11;22;33;44};2) cell 33 6.14.5 HLOOKUP inline-array source, sorted 195HLOOKUP.inline.sorted.arr =HLOOKUP(35;{10;20;30;40|11;22;33;44};2) array 33 6.14.5 HLOOKUP inline-array source, sorted 196HLOOKUP.nested.exact.cell =HLOOKUP(30;H1:L2*1;2;0) cell 33 6.14.5 HLOOKUP nested-expression source (ForceArray) 197HLOOKUP.nested.exact.arr =HLOOKUP(30;H1:L2*1;2;0) array 33 6.14.5 HLOOKUP nested-expression source (ForceArray) 198MATCH.range.exact.cell =MATCH(30;D1:D5;0) cell 3 6.14.9 MATCH exact, column range 199MATCH.range.exact.arr =MATCH(30;D1:D5;0) array 3 6.14.9 MATCH exact, column range 200MATCH.range.sorted.cell =MATCH(35;D1:D5) cell 3 6.14.9 MATCH MatchType 1: largest value <= search 201MATCH.range.sorted.arr =MATCH(35;D1:D5) array 3 6.14.9 MATCH MatchType 1: largest value <= search 202MATCH.range.nomatch.cell =MATCH(35;D1:D5;0) cell #N/A 6.14.9 MATCH exact, no match is #N/A 203MATCH.range.nomatch.arr =MATCH(35;D1:D5;0) array #N/A 6.14.9 MATCH exact, no match is #N/A 204MATCH.row.exact.cell =MATCH(30;H1:L1;0) cell 3 6.14.9 MATCH exact, row range 205MATCH.row.exact.arr =MATCH(30;H1:L1;0) array 3 6.14.9 MATCH exact, row range 206MATCH.inline.row.cell =MATCH(30;{10;20;30;40};0) cell 3 6.14.9 MATCH inline-array row source 207MATCH.inline.row.arr =MATCH(30;{10;20;30;40};0) array 3 6.14.9 MATCH inline-array row source 208MATCH.inline.col.cell =MATCH(30;{10|20|30|40};0) cell 3 6.14.9 MATCH inline-array column source 209MATCH.inline.col.arr =MATCH(30;{10|20|30|40};0) array 3 6.14.9 MATCH inline-array column source 210MATCH.nested.and.cell =MATCH(1;(A1:A9="x")*(B1:B9="y");0) cell 3 6.14.9 MATCH nested-expression source: first row with A=x and B=y 211MATCH.nested.and.arr =MATCH(1;(A1:A9="x")*(B1:B9="y");0) array 3 6.14.9 MATCH nested-expression source: first row with A=x and B=y 212MATCH.nested.mul.cell =MATCH(30;D1:D5*1;0) cell 3 6.14.9 MATCH nested-expression source 213MATCH.nested.mul.arr =MATCH(30;D1:D5*1;0) array 3 6.14.9 MATCH nested-expression source 214MATCH.nested.sorted.cell =MATCH(35;D1:D5*1;1) cell 3 6.14.9 MATCH nested-expression source, MatchType 1 215MATCH.nested.sorted.arr =MATCH(35;D1:D5*1;1) array 3 6.14.9 MATCH nested-expression source, MatchType 1 216ISECT.abs.row3 =ABS(D1:D5) cell@3 30 3.3 1.2.2: column-vector range in scalar parameter, intersect formula row 3 217ISECT.abs.row7 =ABS(D1:D5) cell@7 #ERR 3.3 note 4: no intersection gives #N/A or a more specific Error 218ISECT.match.row4 =MATCH(D1:D5;D1:D5;0) cell@4 4 Search is Scalar: implicit intersection gives D4=40, position 4 219ISECT.match.row2 =MATCH(D1:D5;D1:D5;0) cell@2 2 Search is Scalar: implicit intersection gives D2=20, position 2 220ISECT.match.row7 =MATCH(D1:D5;D1:D5;0) cell@7 #ERR no intersection at row 7: #N/A or a more specific Error 221ISECT.vlookup.row2 =VLOOKUP(D1:D5;D1:F5;2;0) cell@2 22 Lookup is Any, not ForceArray: intersection D2=20, then column 2 = 22 222LINEST.range.cell =LINEST(N1:N6;O1:O6) cell 2.28571428571 6.18.41 LINEST: plain cell shows element (0;0) by 3.2.2/3.3 1.1 = slope 223LINEST.range.arr =LINEST(N1:N6;O1:O6) array:2x1 2.28571428571|0.666666666667 6.18.41 LINEST: slope, intercept 224LINEST.range.stats =LINEST(N1:N6;O1:O6;1;1) array:2x5 2.28571428571|0.666666666667|0.164957219768|0.64241607444|0.979591836735|0.690065559342|192|4|91.4285714286|1.90476190476 6.18.41 LINEST Table 29 with Stats TRUE, values from the 1.3 formulas 225LINEST.range.statscell =LINEST(N1:N6;O1:O6;1;1) cell 2.28571428571 6.18.41 LINEST: plain cell with Stats shows element (0;0) 226LINEST.nox.cell =LINEST(N1:N6) cell 2.28571428571 6.18.41 LINEST: KnownX omitted = 1,2,3,... 227LINEST.nox.arr =LINEST(N1:N6) array:2x1 2.28571428571|0.666666666667 6.18.41 LINEST: KnownX omitted = 1,2,3,... 228LINEST.emptyx.arr =LINEST(N1:N6;;1;0) array:2x1 2.28571428571|0.666666666667 6.18.41 LINEST: KnownX empty parameter = 1,2,3,... 229LINEST.noconst.cell =LINEST(N1:N6;O1:O6;0) cell 2.43956043956 6.18.41 LINEST: Const FALSE, slope through origin 230LINEST.noconst.arr =LINEST(N1:N6;O1:O6;0) array:2x1 2.43956043956|0 6.18.41 LINEST: Const FALSE, a = 0 231LINEST.inline.cell =LINEST({3;5;8;9;13;14};{1;2;3;4;5;6}) cell 2.28571428571 6.18.41 LINEST inline-array sources 232LINEST.inline.arr =LINEST({3;5;8;9;13;14};{1;2;3;4;5;6}) array:2x1 2.28571428571|0.666666666667 6.18.41 LINEST inline-array sources 233LINEST.nested.cell =LINEST(N1:N6*1;O1:O6*1) cell 2.28571428571 6.18.41 LINEST nested-expression sources (ForceArray) 234LINEST.nested.arr =LINEST(N1:N6*1;O1:O6*1) array:2x1 2.28571428571|0.666666666667 6.18.41 LINEST nested-expression sources (ForceArray) 235LINEST.k2.const =LINEST({3;5};{1;2}) cell #ERR KNOWN DEVIATION, kept on purpose: AOO allows zero degrees of freedom (two-point regression); 6.18.41 LINEST: Const TRUE and k <= n+1 (k=2, n=1) returns an error 236LINEST.k1.noconst =LINEST({3};{1};0) cell #ERR KNOWN DEVIATION, kept on purpose: AOO allows zero degrees of freedom (two-point regression); 6.18.41 LINEST: Const FALSE and k <= n (k=1, n=1) returns an error 237LINEST.k2.noconst =LINEST({3;5};{1;2};0) cell 2.6 6.18.41 LINEST: Const FALSE, k=2 > n=1 is valid, slope through origin 238LINEST.k3.cell =LINEST({3;5;8};{1;2;3}) cell 2.5 6.18.41 LINEST: k=3 > n+1, valid 239LINEST.constmissing =LINEST(N1:N6;O1:O6;) cell - empty Const parameter is not in the 1.3 syntax; current behaviour only 240LINEST.nonnum =LINEST({3;"a";8};{1;2;3}) cell #ERR 6.18.41 LINEST: an entry that does not convert to Number is an error 241LOGEST.range.cell =LOGEST(P1:P6;O1:O6) cell 1.96506174 6.18.42 LOGEST: plain cell shows element (0;0) = e^b 242LOGEST.range.arr =LOGEST(P1:P6;O1:O6) array:2x1 1.96506174|1.00150869124 6.18.42 LOGEST: e^b, e^a 243LOGEST.range.stats =LOGEST(P1:P6;O1:O6;1;1) array:2x5 - 6.18.42 LOGEST with Stats: statistics of the linearized fit not recomputed here; current behaviour only 244LOGEST.nox.cell =LOGEST(P1:P6) cell 1.96506174 6.18.42 LOGEST: KnownX omitted = 1,2,3,... 245LOGEST.nox.arr =LOGEST(P1:P6) array:2x1 1.96506174|1.00150869124 6.18.42 LOGEST: KnownX omitted = 1,2,3,... 246LOGEST.inline.cell =LOGEST({2;4;7;15;30;58};{1;2;3;4;5;6}) cell 1.96506174 6.18.42 LOGEST inline-array sources 247LOGEST.inline.arr =LOGEST({2;4;7;15;30;58};{1;2;3;4;5;6}) array:2x1 1.96506174|1.00150869124 6.18.42 LOGEST inline-array sources 248LOGEST.nested.cell =LOGEST(P1:P6*1;O1:O6*1) cell 1.96506174 6.18.42 LOGEST nested-expression sources (ForceArray) 249LOGEST.nested.arr =LOGEST(P1:P6*1;O1:O6*1) array:2x1 1.96506174|1.00150869124 6.18.42 LOGEST nested-expression sources (ForceArray) 250LOGEST.negy =LOGEST({3;-5;8};{1;2;3}) cell #ERR 6.18.42 LOGEST: a negative entry in KnownY is an error 251FTEST.11_3.cell =FTEST(AH1:AH11;AI1:AI3) cell 0.8364238848 6.18.30 FTEST: n1=11, n2=3, s1^2/s2^2=1.05, 2*min(Ptail,1-Ptail) 252FTEST.11_3.arr =FTEST(AH1:AH11;AI1:AI3) array 0.8364238848 6.18.30 FTEST: n1=11, n2=3, s1^2/s2^2=1.05 253FTEST.3_11.cell =FTEST(AI1:AI3;AH1:AH11) cell 0.8364238848 6.18.30 FTEST: arguments swapped, ratio 1/1.05, F(2,10) 254FTEST.equal.cell =FTEST(AJ1:AJ4;AK1:AK4) cell 1 6.18.30 FTEST: identical data, ratio 1, Ptail=0.5, result 1 255FTEST.inline.cell =FTEST({6;6;6;6;3;2;1;2;6;4;2};{1;3;5}) cell 0.8364238848 6.18.30 FTEST inline-array sources, same data as FTEST.11_3 256FTEST.nested.cell =FTEST(AH1:AH11*1;AI1:AI3*1) cell 0.8364238848 6.18.30 FTEST nested-expression sources, same data 257FTEST.one =FTEST(AI1:AI1;AI1:AI3) cell - constraint (at least 2 numbers) violated; the Error is not stated for constraint violations here 258FTEST.zerovar =FTEST({1;1;1};{1;3;5}) cell - constraint (nonzero variances) violated; the Error is not stated 259DAYS360.us.false =DAYS360(DATE(2024;2;29);DATE(2024;3;31);FALSE) cell 30 6.10.7 DAYS360: US method, start last day of Feb becomes 30, end 31 becomes 30 260DAYS360.eu.true =DAYS360(DATE(2024;2;29);DATE(2024;3;31);TRUE) cell 31 6.10.7 DAYS360: European method, Feb days never changed, end 31 becomes 30 261DAYS360.omit =DAYS360(DATE(2024;2;29);DATE(2024;3;31)) cell 30 6.10.7 DAYS360: Method defaults to FALSE 262DAYS360.swap.true =DAYS360(DATE(2024;3;31);DATE(2024;2;29);TRUE) cell -31 6.10.7 DAYS360: European method swaps dates, sign -1 263DAYS360.swap.false =DAYS360(DATE(2024;3;31);DATE(2024;2;29);FALSE) cell -31 6.10.7 DAYS360: US method never swaps 264DAYS360.feb23.false =DAYS360(DATE(2023;2;28);DATE(2023;3;31);FALSE) cell 30 6.10.7 DAYS360: US method, 28 Feb 2023 is last day of Feb -> 30 265DAYS360.feb23.true =DAYS360(DATE(2023;2;28);DATE(2023;3;31);TRUE) cell 32 6.10.7 DAYS360: European method, 28 stays 266DAYS360.num0 =DAYS360(DATE(2024;2;29);DATE(2024;3;31);0) cell - Method as a number: conversion not exercised by the 1.3 text here 267DAYS360.num1 =DAYS360(DATE(2024;2;29);DATE(2024;3;31);1) cell - Method as a number: conversion not exercised by the 1.3 text here 268CELL.addr.other =CELL("ADDRESS";$Other.B2) cell - 6.13.3: sheet name included for another sheet; the text form is not specified 269CELL.addr.other.range =CELL("ADDRESS";$Other.B2:C3) cell - 6.13.3: top-left cell of the range; text form not specified 270CELL.addr.same =CELL("ADDRESS";B2) cell - 6.13.3: same sheet, no sheet name; text form not specified 271CELL.col.other =CELL("COL";$Other.B2) cell 2 6.13.3 Table 17: column number 272CELL.row.other =CELL("ROW";$Other.B2) cell 2 6.13.3 Table 17: row number 273CELL.sheet.other =CELL("SHEET";$Other.B2) cell - 6.13.3 Table 17: sheet number; numbering base not stated 274BESSELK.x0 =BESSELK(0;1) cell - 6.16.14/15: constraint X <> 0; no value is given for x <= 0 275BESSELK.xm1 =BESSELK(-1;1) cell - 6.16.14/15: constraint X <> 0; no value is given for x <= 0 276BESSELK.xm0p5 =BESSELK(-0.5;1) cell - 6.16.14/15: constraint X <> 0; no value is given for x <= 0 277BESSELK.n0.x0 =BESSELK(0;0) cell - constraint X <> 0 violated 278BESSELY.x0 =BESSELY(0;1) cell - 6.16.14/15: constraint X <> 0; no value is given for x <= 0 279BESSELY.xm1 =BESSELY(-1;1) cell - 6.16.14/15: constraint X <> 0; no value is given for x <= 0 280BESSELY.xm0p5 =BESSELY(-0.5;1) cell - 6.16.14/15: constraint X <> 0; no value is given for x <= 0 281BESSELY.n0.x0 =BESSELY(0;0) cell - constraint X <> 0 violated 282BESSELK.ctl.K0 =BESSELK(1;0) cell ~0.421024438241 control: K0(1), integral definition evaluated numerically; ~ = relative tolerance 1e-6 (the build is accurate to about 1e-8) 283BESSELK.ctl.K1 =BESSELK(1;1) cell ~0.601907230197 control: K1(1); ~ tolerance 284BESSELY.ctl.Y0 =BESSELY(1;0) cell ~0.0882569642157 control: Y0(1); ~ tolerance 285BESSELY.ctl.Y1 =BESSELY(1;1) cell ~-0.7812128213 control: Y1(1); ~ tolerance 286FARR.sumprod.match =SUMPRODUCT(--ISNUMBER(MATCH(D1:D5;D1:D5;0))) cell 5 ForceArray context of SUMPRODUCT reaches the scalar parameter of MATCH (must keep working in a plain cell) 287FARR.sumprod.vlookup =SUMPRODUCT(VLOOKUP(D1:D3;D1:E5;2;0)) cell 66 same for VLOOKUP: 11+22+33 288FARR.sumprod.abs =SUMPRODUCT(ABS(D1:D3)) cell 60 control without lookup function 289 290# ODF 1.4 Part 4 changes: EASTERSUNDAY without a year and with a year range, CONVERT SI_at, the IS* family on errors, DAYS, SECOND/MINUTE rounding, 291# the 1583 year limit, INDEX on row and column vectors. Columns as above. 292EASTER.1583 =EASTERSUNDAY(1583)-DATE(1583;4;10) cell 0 6.10.8 EASTERSUNDAY: lower bound of the allowed range 293EASTER.1900 =EASTERSUNDAY(1900)-DATE(1900;4;15) cell 0 6.10.8 algorithm 294EASTER.2000 =EASTERSUNDAY(2000)-DATE(2000;4;23) cell 0 6.10.8 algorithm 295EASTER.2024 =EASTERSUNDAY(2024)-DATE(2024;3;31) cell 0 6.10.8 algorithm 296EASTER.2025 =EASTERSUNDAY(2025)-DATE(2025;4;20) cell 0 6.10.8 algorithm 297EASTER.9956 =EASTERSUNDAY(9956)-DATE(9956;4;22) cell 0 6.10.8 upper bound of the allowed range 298EASTER.low =EASTERSUNDAY(1582) cell #ERR 6.10.8 constraint 1583 <= Year 299EASTER.high =EASTERSUNDAY(9957) cell #ERR 6.10.8 constraint Year <= 9956 300EASTER.noarg =IF(EASTERSUNDAY()>=TODAY();1;0) cell 1 6.10.8 without Year: the next Easter Sunday on or after TODAY() 301EASTER.noarg.dist =EASTERSUNDAY()-TODAY() cell - 6.10.8 without Year: distance is recorded only (it depends on the day the test runs) 302CONVERT.atm =CONVERT(1;"atm";"Pa") cell 101325.1 6.16.18 Table 24: atm is the Standard atmosphere, 1.0132510E+5 Pa 303CONVERT.SI_at =CONVERT(1;"SI_at";"Pa") cell 98066.5 6.16.18 Table 24: SI_at is the Technical atmosphere, 9.8066510E+4 Pa 304CONVERT.at =CONVERT(1;"at";"Pa") cell - 6.16.18 Table 24: at is deprecated, recorded only 305NPER.omit =NPER(0.01;-100;1000)-NPER(0.01;-100;1000;0;0) cell 0 6.12.29 Fv and PayType default to 0 306NPER.empty =NPER(0.01;-100;1000;;)-NPER(0.01;-100;1000;0;0) cell 0 6.12.29 empty Fv and PayType take the defaults; known deviation: the formula compiler rejects an empty last parameter before ')' for every function except IF (Err:511) 307NPER.paytype1 =NPER(0.01;-100;1000;0;1)-NPER(0.01;-100;1000;0;0) cell - 6.12.29 PayType 1 differs; recorded only 308INDEX.col.row =INDEX(D1:D5;2) cell 20 6.14.6 column vector, Row only: the entire row of the area 309INDEX.col.rowcol =INDEX(D1:D5;2;1) cell 20 6.14.6 column vector, Row and Column 310INDEX.row.col =INDEX(D1:F1;1;3) cell 101 6.14.6 row vector, Row and Column 311INDEX.row.rowonly =INDEX(H1:L1;3) cell #ERR 6.14.6 (1.4) row vector with Row = 3 > 1 row: an Error; 1.3 let Row act as the column offset 312INDEX.row.empty =INDEX(H1:L1;;3) cell 30 6.14.6 row vector, Column only 313INDEX.col.beyond =INDEX(D1:D5;2;2) cell #ERR 6.14.6 Column greater than the dimension of the area is an Error 314ISBLANK.err =ISBLANK(NA()) cell 0 6.13.14 an Error argument returns FALSE 315ISBLANK.err2 =ISBLANK(1/0) cell 0 6.13.14 an Error argument returns FALSE 316ISLOGICAL.err =ISLOGICAL(NA()) cell 0 6.13.19 an Error argument returns FALSE 317ISLOGICAL.err2 =ISLOGICAL(1/0) cell 0 6.13.19 an Error argument returns FALSE 318ISNUMBER.err =ISNUMBER(NA()) cell 0 6.13.22 an Error argument returns FALSE 319ISNUMBER.err2 =ISNUMBER(1/0) cell 0 6.13.22 an Error argument returns FALSE 320ISTEXT.err =ISTEXT(NA()) cell 0 6.13.25 an Error argument returns FALSE 321ISTEXT.err2 =ISTEXT(1/0) cell 0 6.13.25 an Error argument returns FALSE 322ISNONTEXT.err =ISNONTEXT(NA()) cell 1 6.13.21 an Error argument returns TRUE 323ISNONTEXT.err2 =ISNONTEXT(1/0) cell 1 6.13.21 an Error argument returns TRUE 324ISBLANK.ref =ISBLANK(AB1) cell 1 6.13.14 unchanged: a reference to an empty cell 325DAYS.num =DAYS(DATE(2024;3;10);DATE(2024;3;1)) cell 9 6.10.6 Numbers: EndDate - StartDate 326DAYS.text =DAYS("2024-03-10";"2024-03-01") cell 9 6.10.6 (1.4) Text: DATEVALUE(EndDate) - DATEVALUE(StartDate); 1.3 had the operands the other way round (-9) 327SECOND.round.up =SECOND(TIME(0;0;59)+0.6/86400) cell 0 6.10.17 (1.4) T is rounded to the nearest second first: 59.6 s is 60 s, second 0 328MINUTE.round.up =MINUTE(TIME(0;0;59)+0.6/86400) cell 1 6.10.13 (1.4) the same rounding carries into the minute 329SECOND.round.down =SECOND(TIME(0;0;59)+0.4/86400) cell 59 6.10.17 59.4 s rounds to 59 330SECOND.plain =SECOND(TIME(1;2;3)) cell 3 6.10.17 an exact time 331MINUTE.plain =MINUTE(TIME(1;2;3)) cell 2 6.10.13 an exact time 332LEAP.1900 =DATE(1900;3;1)-DATE(1900;2;28) cell 1 7.4 1900 was not a leap year 333LEAP.2000 =DATE(2000;3;1)-DATE(2000;2;28) cell 2 7.4 2000 was a leap year 334LEAP.2100 =DATE(2100;3;1)-DATE(2100;2;28) cell 1 7.4 2100 is not a leap year 335Y1583.jan1 =DATE(1583;1;2)-DATE(1583;1;1) cell 1 7.4 dates from 1 January 1583 are calculated 336Y1500.leap =DATE(1500;3;1)-DATE(1500;2;28) cell - 7.4 before 1583 the system is implementation-defined (proleptic Gregorian: 1, Julian: 2) 337Y1582.switch =DATE(1582;10;15)-DATE(1582;10;4) cell - 7.4 proleptic Gregorian gives 11, a Julian-to-Gregorian switch gives 1 338CONVERT.g.kg =CONVERT(1;"g";"kg") cell 0.001 control: the add-in rewrite reaches a known unit pair 339CONVERT.bogus =CONVERT(1;"nosuchunit";"Pa") cell #ERR control: an unknown unit is an error 340EASTER.mid =EASTERSUNDAY(1000) cell #ERR 6.10.8 constraint 1583 <= Year (100 to 1582) 341EASTER.neg =EASTERSUNDAY(-1) cell #ERR 6.10.8 constraint 1583 <= Year (negative years used to wrap) 342EASTER.wrap =EASTERSUNDAY(67536) cell #ERR 6.10.8 constraint Year <= 9956 (67536 used to wrap to 2000) 343