Hacktoberfest 2026:メンテナが10月に向けて印を付けた、オープンで初心者向けの issue。 Hacktoberfest の issue を見る

[RFC]: Migrate `math/base/special` packages from relative tolerance testing to ULP difference testing (tracking issue)

オープン
#11,352 コメント 3 件 リアクション 2 件 担当者 0 名 GitHub で見る

メンテナーはふだん 1 日以内に返信

まだ誰も着手していません。

評価

難易度
3/5
見積もり時間
1〜2日
初心者へのやさしさ
68/100
issue の種類
リファクタリング
明瞭さ
おおむね明確
活発さ
静か
技術スタック
javascript
領域
testing-qa

調査の方向性

まずコミット 121f2c0 と @stdlib/assert/is-almost-same-value のドキュメントを調べ、次に math/base/special 配下の test/ フォルダーを検索して、相対許容値のケースを使用しているパッケージを探します。1つのパッケージだけのテストを移行し、動作を維持して、最小の ULP 値を使用します。make test TESTS_FILTER="./math/base/special//." を実行し、すべてのケースがパスすることを確認します。

索引モデルが issue の本文から書いたものです。

説明

Accepted difficulty: 1 Good First Issue JavaScript Math Modernization priority: Normal Tests

Instructions

  1. Read the issue description below.
  2. Read the issue comment which follows the description.
  3. Search for a package in math/base/special having relative tolerance tests which needs updating according to the description below.
  4. Follow any additional guidance specified in this issue.

Description

This RFC proposes migrating from Relative Tolerance testing to ULP Difference testing for math/base/special functions.

In short, this RFC seeks to refactor testing from, for example

var abs = require( '@stdlib/math/base/special/abs' );

var delta = abs( y - expected[ i ] );
var tol = EPS * abs( expected[ i ] );
t.ok( delta <= tol, 'within tolerance. x: '+x[i]+'. y: '+y );

to

var isAlmostSameValue = require( '@stdlib/assert/is-almost-same-value' );

t.strictEqual( isAlmostSameValue( y, expected[ i ], 1 ), true, 'returns expected value' );

The migration is demonstrated in commit 121f2c0

In particular, notice three things:

  1. We add the import @stdlib/assert/is-almost-same-value. See the documentation for @stdlib/assert/is-almost-same-value for supported parameters.
  2. We remove var delta = abs( y - expected[ i ] ); and var tol = EPS * abs( expected[ i ] );
  3. We replace t.ok( ... ); with t.strictEqual( isAlmostSameValue( v, expected[ i ], 1 ), true, 'returns expected value' ); with the returned output, expected value and the minimum required ulp value. Also, make sure the message is 'returns expected value' for every test case.

By performing this refactoring, we facilitate

  1. Measuring error in units of the representable gap at that magnitude, which is the natural accuracy unit for floating-point.
  2. Enables a uniform accuracy budget
  3. Easier to test both real and complex functions, across single-precision and double-precision, with consistent and trustworthy rules.

Note: In certain functions, we may encounter different return values in the JavaScript and C implementation for the same implementation. In that case, refer to this commit 69e1068. This was discussed here in detail FAQ.

Steps

Given the relatively widespread practice of using relative tolerance in testing, this RFC aims to be an open call for any contributor wanting to contribute to the project to do the following:

  1. Study the changes made in commit 121f2c0, as this commit contains the sorts of changes that we are looking for.
  2. Ensure you have setup your local development environment by following the contributing guide, including make install-node-modules and make init.
  3. Study the documentation for @stdlib/assert/is-almost-same-value.
  4. Find a package containing relative tolerance test cases.
  5. Update the test cases for that package, and only that package, to migrate to use ULP difference testing. Make sure that you put the minimum required ULP value possible. Tests can be found in the test/ folder of a package (if it exists).
  6. Run tests locally using the command make test TESTS_FILTER=".*/math/base/special/<package-name>/.*". For example, make test TESTS_FILTER=".*/math/base/special/hyp2f1/.*".
  7. Verify that the updated ULP values pass all the test cases.
  8. Commit your changes.
  9. Submit a PR updating the test for that package (and only that package).
  10. For the PR title, use the following template "test: migrate <package-name> to ULP-based testing" where <package_name> is the name of the package you updated (e.g., math/base/special/hyp2f1).
  11. In the PR body/description, use the phrase "Resolves a part of ", and not "Resolves " or "Closes ", this issue, as this is a tracking issue and your PR only addresses one package of many needing updating.
Related Issues

None

Questions

None.

Other
  • If you are interested in working on this RFC, for each pull request, please only update the tests for a single package.
  • As mentioned above, please do NOT make extraneous changes to test cases. We are not interested in changing tests wholesale. Nor are we interested in new "creative" changes. We are only interested in migrating from relative tolerance testing to ULP diff based testing Failure to match the behavior of the existing tests and to respect this guidance will result in your PRs being automatically closed without review.
  • As this is a "Good First Issue", you are strongly encouraged to avoid using AI when authoring your contribution. One of the primary intents of Good First Issues is to help introduce you to stdlib, its development environment, and the contribution process, as documented in the contributing guide. Most new contributors are unfamiliar with stdlib and its conventions, and thus fail to appropriately use LLMs and AI when authoring contributions, most often generating AI slop and leading to wasted time. Don't be one of those people. :) Take the time to manually author your first several PRs, and, once you are intimately familiar with project conventions, you can consider leveraging AI to augment your dev tasks.
Checklist
  • I have read and understood the Code of Conduct.
  • Searched for existing issues and pull requests.
  • The issue name begins with RFC:.
主要言語
JavaScript
スター
6k
フォーク
1.3k
平均マージ
1日 8時間
マージ済み PR(30日)
586

環境構築

Codespaces で開く

このプロジェクトの開発コンテナを、あなたの GitHub アカウントでブラウザ上に起動します。

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

stdlib-js/stdlib のほかの issue

stdlib-js/stdlib の issue をすべて見る

似ている issue

JavaScript の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。