diff options
author | xuri <xuri.me@gmail.com> | 2022-04-03 01:18:32 +0800 |
---|---|---|
committer | xuri <xuri.me@gmail.com> | 2022-04-03 01:18:32 +0800 |
commit | be8fc0a4c5795bb793b171c25fd90e0369812a05 (patch) | |
tree | 1f86d3ebec7e2db7dcb68e19d87692e2a12cea61 | |
parent | b8345731a477633bc82216dbc398faecafaf894f (diff) |
ref #65, new formula functions: T.DIST.2T and T.DIST.RT
- Update GitHub Action settings
-rw-r--r-- | .github/workflows/codeql-analysis.yml | 44 | ||||
-rw-r--r-- | .github/workflows/go.yml | 4 | ||||
-rw-r--r-- | calc.go | 54 | ||||
-rw-r--r-- | calc_test.go | 16 |
4 files changed, 76 insertions, 42 deletions
diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 9dddb57..c62270a 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -1,15 +1,9 @@ -# For most projects, this workflow file will not need changing; you simply need -# to commit it to your repository. -# -# You may wish to alter this file to override the set of languages analyzed, -# or to provide custom queries or build logic. name: "CodeQL" on: push: branches: [master] pull_request: - # The branches below must be a subset of the branches above branches: [master] schedule: - cron: '0 6 * * 3' @@ -22,50 +16,20 @@ jobs: strategy: fail-fast: false matrix: - # Override automatic language detection by changing the below list - # Supported options are ['csharp', 'cpp', 'go', 'java', 'javascript', 'python'] language: ['go'] - # Learn more... - # https://docs.github.com/en/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#overriding-automatic-language-detection steps: - name: Checkout repository - uses: actions/checkout@v2 - with: - # We must fetch at least the immediate parents so that if this is - # a pull request then we can checkout the head. - fetch-depth: 2 - - # If this run was triggered by a pull request event, then checkout - # the head of the pull request instead of the merge commit. - - run: git checkout HEAD^2 - if: ${{ github.event_name == 'pull_request' }} + uses: actions/checkout@v3 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v1 + uses: github/codeql-action/init@v2 with: languages: ${{ matrix.language }} - # If you wish to specify custom queries, you can do so here or in a config file. - # By default, queries listed here will override any specified in a config file. - # Prefix the list here with "+" to use these queries and those in the config file. - # queries: ./path/to/local/query, your-org/your-repo/queries@main - # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). - # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild - uses: github/codeql-action/autobuild@v1 - - # âšī¸ Command-line programs to run using the OS shell. - # đ https://git.io/JvXDl - - # âī¸ If the Autobuild fails above, remove it and uncomment the following three lines - # and modify them (or add more) to build your code if your project - # uses a compiled language - - #- run: | - # make bootstrap - # make release + uses: github/codeql-action/autobuild@v2 - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v1 + uses: github/codeql-action/analyze@v2 diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index 8310222..bc5db46 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -14,12 +14,12 @@ jobs: steps: - name: Install Go - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: ${{ matrix.go-version }} - name: Checkout code - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Get dependencies run: | @@ -658,6 +658,8 @@ type formulaFuncs struct { // TBILLPRICE // TBILLYIELD // T.DIST +// T.DIST.2T +// T.DIST.RT // TDIST // TEXTJOIN // TIME @@ -9072,6 +9074,58 @@ func (fn *formulaFuncs) TdotDIST(argsList *list.List) formulaArg { return newNumberFormulaArg(getTDist(x.Number, degrees.Number, 4)) } +// TdotDISTdot2T function calculates the two-tailed Student's T Distribution, +// which is a continuous probability distribution that is frequently used for +// testing hypotheses on small sample data sets. The syntax of the function +// is: +// +// T.DIST.2T(x,degrees_freedom) +// +func (fn *formulaFuncs) TdotDISTdot2T(argsList *list.List) formulaArg { + if argsList.Len() != 2 { + return newErrorFormulaArg(formulaErrorVALUE, "T.DIST.2T requires 2 arguments") + } + var x, degrees formulaArg + if x = argsList.Front().Value.(formulaArg).ToNumber(); x.Type != ArgNumber { + return x + } + if degrees = argsList.Back().Value.(formulaArg).ToNumber(); degrees.Type != ArgNumber { + return degrees + } + if x.Number < 0 || degrees.Number < 1 { + return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM) + } + return newNumberFormulaArg(getTDist(x.Number, degrees.Number, 2)) +} + +// TdotDISTdotRT function calculates the right-tailed Student's T Distribution, +// which is a continuous probability distribution that is frequently used for +// testing hypotheses on small sample data sets. The syntax of the function +// is: +// +// T.DIST.RT(x,degrees_freedom) +// +func (fn *formulaFuncs) TdotDISTdotRT(argsList *list.List) formulaArg { + if argsList.Len() != 2 { + return newErrorFormulaArg(formulaErrorVALUE, "T.DIST.RT requires 2 arguments") + } + var x, degrees formulaArg + if x = argsList.Front().Value.(formulaArg).ToNumber(); x.Type != ArgNumber { + return x + } + if degrees = argsList.Back().Value.(formulaArg).ToNumber(); degrees.Type != ArgNumber { + return degrees + } + if degrees.Number < 1 { + return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM) + } + v := getTDist(x.Number, degrees.Number, 1) + if x.Number < 0 { + v = 1 - v + } + return newNumberFormulaArg(v) +} + // TDIST function calculates the Student's T Distribution, which is a // continuous probability distribution that is frequently used for testing // hypotheses on small sample data sets. The syntax of the function is: diff --git a/calc_test.go b/calc_test.go index 321934f..6324344 100644 --- a/calc_test.go +++ b/calc_test.go @@ -1159,6 +1159,11 @@ func TestCalcCellValue(t *testing.T) { "=T.DIST(1,10,TRUE)": "0.82955343384897", "=T.DIST(-1,10,TRUE)": "0.17044656615103", "=T.DIST(-1,10,FALSE)": "0.230361989229139", + // T.DIST.2T + "=T.DIST.2T(1,10)": "0.34089313230206", + // T.DIST.RT + "=T.DIST.RT(1,10)": "0.17044656615103", + "=T.DIST.RT(-1,10)": "0.82955343384897", // TDIST "=TDIST(1,10,1)": "0.17044656615103", "=TDIST(1,10,2)": "0.34089313230206", @@ -3024,6 +3029,17 @@ func TestCalcCellValue(t *testing.T) { "=T.DIST(1,0,TRUE)": "#NUM!", "=T.DIST(1,-1,FALSE)": "#NUM!", "=T.DIST(1,0,FALSE)": "#DIV/0!", + // T.DIST.2T + "=T.DIST.2T()": "T.DIST.2T requires 2 arguments", + "=T.DIST.2T(\"\",10)": "strconv.ParseFloat: parsing \"\": invalid syntax", + "=T.DIST.2T(1,\"\")": "strconv.ParseFloat: parsing \"\": invalid syntax", + "=T.DIST.2T(-1,10)": "#NUM!", + "=T.DIST.2T(1,0)": "#NUM!", + // T.DIST.RT + "=T.DIST.RT()": "T.DIST.RT requires 2 arguments", + "=T.DIST.RT(\"\",10)": "strconv.ParseFloat: parsing \"\": invalid syntax", + "=T.DIST.RT(1,\"\")": "strconv.ParseFloat: parsing \"\": invalid syntax", + "=T.DIST.RT(1,0)": "#NUM!", // TDIST "=TDIST()": "TDIST requires 3 arguments", "=TDIST(\"\",10,1)": "strconv.ParseFloat: parsing \"\": invalid syntax", |