summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorxuri <xuri.me@gmail.com>2022-04-03 01:18:32 +0800
committerxuri <xuri.me@gmail.com>2022-04-03 01:18:32 +0800
commitbe8fc0a4c5795bb793b171c25fd90e0369812a05 (patch)
tree1f86d3ebec7e2db7dcb68e19d87692e2a12cea61
parentb8345731a477633bc82216dbc398faecafaf894f (diff)
ref #65, new formula functions: T.DIST.2T and T.DIST.RT
- Update GitHub Action settings
-rw-r--r--.github/workflows/codeql-analysis.yml44
-rw-r--r--.github/workflows/go.yml4
-rw-r--r--calc.go54
-rw-r--r--calc_test.go16
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: |
diff --git a/calc.go b/calc.go
index 6252363..ad62596 100644
--- a/calc.go
+++ b/calc.go
@@ -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",