Der Autor, der hauptsächlich Ruby verwendet, ist auf einen arithmetischen Überlauf gestoßen und hat Lehren gezogen. Daher werde ich die aufgetretenen Situationen und Gegenmaßnahmen erläutern. ** * Diesmal gibt es kein mathematisches Problem ... **
Und danke für die große Auswahl an Tribonatch und Kommentaren! Unter ihnen möchte ich einen Artikel von @torifukukaiou vorstellen, der Tribonacci mit der Elixir-Version gelöst hat. [Ich habe versucht, das Tribonacci-Sequenzproblem mit Elixir zu lösen (Zeitlimit 10 Minuten)] (https://qiita.com/torifukukaiou/items/d5a6639edf541539ac3a?utm_campaign=email&utm_content=link&utm_medium=email&utm_source=public_mention)
Seit dem letzten Kampf mit der Tribonacci-Sequenz sind einige Tage vergangen, und ich suchte nach einer Möglichkeit, die Implementierung zu beschleunigen, um in Zukunft noch intensivere mathematische Probleme zu lösen. In der Zwischenzeit habe ich gelernt, dass die C-Sprache mit gem'RubyInline 'verwendet werden kann, und als ich sie implementiert habe, um die C-Sprache ein wenig zu berühren, ist ein arithmetischer Überlauffehler aufgetreten.
Ich habe mit dem folgenden Befehl ein Verzeichnis und eine rb-Datei erstellt, VSCode geöffnet und bearbeitet.
$ cd Desktop
$ mkdir Ruby_with_c
$ cd Ruby_with_c
$ touch tribonacci.rb
$ bundle init
$ code .
Schreiben Sie gem'RubyInline ',' ~> 3.12 ','> = 3.12.4 'in Gemfile und bündeln Sie die Installation
Gemfile
# frozen_string_literal: true
source "https://rubygems.org"
git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
# gem "rails"
gem 'RubyInline', '~> 3.12', '>= 3.12.4'
$ bundle install
Kakikaki-Code ... (Wie schreibt man C-Sprache ... ´ · ௰ · `) ← Was hast du gemacht? (゚ Д ゚) Ich habe es geschrieben, weil es vorerst einfach sein kann! !!
tribonacci.rb
require 'inline'
class Tribonacci
inline do |builder|
builder.c "
int add(int a, int b, int c){
int d,i = 3;
while (i<50){
d = a + b + c;
a = b;
b = c;
c = d;
i++;
}
return c;
}
"
end
end
puts Tribonacci.new.add(1,3,7)
Der obige Code ist der gleiche wie der Code, der implementiert wurde, um die Tribonatch-Sequenz in Ruby zu lösen. Bei Implementierung mit diesem Code tritt jedoch ein ** arithmetischer Überlauf auf und das Berechnungsergebnis ist negativ **.
Durch Schreiben von require'inline in die erste Zeile können Sie externen Code (C-Sprache) in den Ruby-Code schreiben. Die int-Beschreibung in der 6. Zeile definiert den Datentyp vom Typ int für jeden. Damit erscheint jedoch ein abnormaler Wert, der als Minus angezeigt wird, aus der 36. Antwort in der Tribonacci-Sequenz.
Dieses Phänomen wird als ** arithmetischer Überlauf ** bezeichnet. In der Sprache C wird das Verarbeitungssystem, das zum Minimalwert LONG_MIN (-2147483648) wird, wenn der Maximalwert von int, INT_MAX (2147483647), um 1 überschritten wird. In dieser Implementierung scheint das 36. Element INT_MAX (2147483647) überschritten und von -2147483648 gestartet zu haben.
Dieses Mal wechseln wir von int zu long, um einen arithmetischen Überlauf zu verhindern. langer Maximalwert: 9223372036854775807
tribonacci.rb
require 'inline'
class Tribonacci
inline do |builder|
builder.c "
long add(long a, long b, long c){
long d,i = 3;
while (i<50){
d = a + b + c;
a = b;
b = c;
c = d;
i++;
}
return c;
}
"
end
end
puts Tribonacci.new.add(1,3,7)
Durch den Wechsel zu lang kommt der 36. 3368061131 heraus. Ruby-Ganzzahlen werden übrigens automatisch um die Anzahl der Stellen erweitert, sodass kein arithmetischer Überlauf auftritt. Wenn ich also nur Ruby berühren würde, würde ich keinen arithmetischen Überlauf feststellen. Vielen Dank für das Treffen! !!
Nachdem ich eine Weile die C-Sprache berührt hatte, stieß ich auf einen Fehler, den ich in Ruby nicht gefunden hatte, und lernte viel. Derzeit konnte ich nur das Juwel 'RubyInline' einführen, aber in Zukunft möchte ich eine Erweiterungsbibliothek für die Sprache C erstellen und eine Hochgeschwindigkeitsverarbeitung implementieren, um intensive mathematische Probleme zu lösen.
Wenn jemand ein interessantes mathematisches Problem hat, hinterlasse es bitte in den Kommentaren! !! Der Lösungsprozess war sehr lehrreich und ich war süchtig nach mathematischen Problemen. Basierend auf dem Geist, die Punkte zu verbinden, werde ich weiterhin mein Bestes geben und glaube, dass die Tage des Eintauchens eines Tages leuchten werden!
Recommended Posts