Вход для пользователей

You are here

Новый RPN-кальк на Rust-е для DM42

Тут человек написал новый RPN-калькулятор на Rust-е, который можно собрать как прошивку для DM42:

- Large RPN stack. The RPN stack is not limited to a fixed number of registers.
- Accurate decimal floating point. Uses 128-bit decimal floating point with 34 digits of decimal precision.
- Exact rationals with large integers. Integers and rational numbers are kept in an exact rational representation. Results can be displayed as exact fractions when possible, and the implementation never guesses the closest fraction.
- Unit conversions. Supports conversions between common units. Utilizes the rational representation for unit conversions so that converting between them leads to no loss of precision.
- RPN stack undo. Operations performed on the RPN stack can be undone with a deep undo buffer.
- Works on dedicated calculator hardware. Designed to run on the excellent DM42 from Swiss Micros. This project has been optimized for highly efficient LCD rendering and memory usage to create a very responsive interface. This project is not an emulation and iterative improvement of the HP42 design like the default firmware, but is rather a ground-up modern redesign targeting the DM42 hardware.

Изображение пользователя Vitasam.

С некоторой доработкой напильником смог собрать калькулятор под Линуксом:
RS calc

Выглядит интересно. Надо попробовать собрать для DM42 железа (там тоже понадобится свой напильник, похоже).

Клавиатура явно 42S с небольшими отличиями (LOGIC вместо FLAGS, например).
А что за доработка напильником?
Я попробовал было собрать под виндой, вылезло

Compiling lazy_static v1.4.0                                                                                                                                                              
 error[E0557]: feature has been removed
  --> E:\rust\Cargo\registry\src\github.com-1ecc6299db9ec823\lock_api-0.3.4\src\lib.rs:91:42
   |
91 | #![cfg_attr(feature = "nightly", feature(const_fn))]
   |                                          ^^^^^^^^ feature has been removed
   |
   = note: split into finer-grained feature gates

   Compiling num-traits v0.2.15
   Compiling num-integer v0.1.45
   Compiling num-bigint v0.3.3
For more information about this error, try `rustc --explain E0557`.
error: could not compile `lock_api` due to previous error
warning: build failed, waiting for other jobs to finish...

дальше особо не разбирался.

Изображение пользователя Vitasam.

Похоже, что проекты на Rust-е очень быстро протухают, если за ними "не ухаживать". Судя по тому, что пулл-реквест висит с декабря 2020 года, автор не особо активен тут. А жаль - во-первых, реально интересный калькулятор под PC и DM42, во-вторых, на Rust-е. Пожалуй, надо форкнуть этот проект себе.

У меня под Линуксом собралось, когда в math/Cargo.toml повысил версию linked_list_allocator до 0.9:

linked_list_allocator = { version = "0.9" }

и выбрал nightly версию:

rustup default nightly

Под Виндой, скорее всего, не соберется, так как калькулятор написан под GTK.

Пытаюсь собрать для DM42, но там вылезли другие напильники:

...:~/GITprojects/Github/rscalc$ make
cargo build --target thumbv7em-none-eabihf -Z build-std=core,alloc --release --no-default-features --features dm42
    Updating crates.io index
   Compiling rscalc v0.1.0 (/home/.../Github/rscalc)
   Compiling rscalc_math v0.1.0 (/home/.../Github/rscalc/math)
error[E0432]: unresolved import `num_bigint::TryFromBigIntError`
 --> math/src/error.rs:2:5
  |
2 | use num_bigint::TryFromBigIntError;
  |     ^^^^^^^^^^^^------------------
  |     |           |
  |     |           help: a similar name exists in the module: `ParseBigIntError`
  |     no `TryFromBigIntError` in the root

P.S. Похоже, этот пулл-реквест и фиксит последнюю проблему.

P.P.S Да, фиксит, но всплывают новые напильники:

...
  = note: rust-lld: error: duplicate symbol: __aeabi_d2f
          >>> defined at rscalc.b3b4f384-cgu.0
          >>>            /home/.../Github/rscalc/target/thumbv7em-none-eabihf/release/deps/rscalc-201d8df9902ac16b.rscalc.b3b4f384-cgu.0.rcgu.o:(__aeabi_d2f)
          >>> defined at compiler_builtins.bc3efce5-cgu.0
...

Кто в уважаемом сообществе умеет Rust готовить?

Да, под виндой после linked_list_allocator = { version = "0.9" } даже до GTK не доходит и дальше упирается в intel_dfp, что не удивительно, эта библиотека идет в исходниках калькулятора в собраном только для dm42 и для linux x86_64 виде.

Вопрос, что этот калькулятор возвращеает при расчете arcsin(arccos(arctan(tan(cos(sin(1))))))-1 в радианах?
Интересно, что Free42/DM42 возвращают 1E-33, хотя другие калькуляторы, в том числе и старенький HP-42s возвращают 0. Менее точная десктопная версия калькулятора Free42Binary тоже возвращает ноль. Я пытаюсь понять, это особенность Intel-овской библиотеки или все же какая-то особенность Free42.

Ну и стандартный arcsin(arccos(arctan(tan(cos(sin(9)))))) тест в градусах тоже интересен, для статистики ;)

Изображение пользователя Vitasam.

Да, под виндой после linked_list_allocator = { version = "0.9" } даже до GTK не доходит и дальше упирается в intel_dfp, что не удивительно, эта библиотека идет в исходниках калькулятора в собраном только для dm42 и для linux x86_64 виде.

Да, автор там писал в Readme, что интеловскую библиотеку он не мог собрать под Clang, поэтому он положил в гитхаб предкомпилированные библиотеки. Под Windows он не компилировал по понятной причине.

Результаты тестов. Похоже, точность как в DM42. Мне нравится вид вывода - с указанием единиц:

arcsin(arccos(arctan(tan(cos(sin(1))))))-1 в радианах

Test in RAD

стандартный arcsin(arccos(arctan(tan(cos(sin(9)))))) тест в градусах

Test in DEG

Изображение пользователя Vitasam.

В общем, собрался .pgm файл для DM42. Вроде, работает, но что-то косячит (часто вылезает NaN) вместо значения:
RSCALC on DM42

Сделаю форк проекта и добавлю свои фиксы. Автору выложу пулл-реквест, ну, чтобы было.

P.S. Форк со всеми фиксами.