konvertieren von float-zu kurz-mit minimalem Verlust an Genauigkeit

Habe ich diese Sinus-Welle, die erzeugt floating-point-Werte (z.B. 0.37885), aber ich will Sie als shorts. Direkte Umwandlung mit kurzen gibt mir einen Wert von 0. also, was ist die Lösung?

Kann mir jemand sagen, wie es zu tun - idealerweise ohne Verlust der Genauigkeit - oder minimalem Verlust an Genauigkeit, wenn das ist alles, was möglich ist?

  • Die Größe der float ist in der Regel 4 bytes, und die Größe der short ist in der Regel 2 bytes. Wie genau sind Sie in der Hoffnung zu vermeiden, Verlust an Präzision bei der Quetschung 4 Daten-bytes in 2 bytes an Daten?
  • Zu helfen, zu verstehen, das problem, das Sie versuchen zu lösen, können Sie erklären, warum Sie benötigen, um zu speichern ein Schwimmer in einem kurzen?
  • Plus, wie werden Sie zu "konvertieren" ein floating-point-Wert auf eine nicht-floating-point?
  • Sie müssen entscheiden, entweder einen bestimmten Punkt, um für das niedrigste bit, oder schreiben Sie code zum speichern der float wie die FPU normalerweise tut.
  • Das ist nicht ein Problem. Wenn Sie eine ganze Zahl, die gleiche Größe (int tun würde, auf den meisten Plattformen), dann gibt es kein problem mit Hinblick auf die Art der Daten. Zum Beispiel, gegeben float f und int i Sie tun können i = *(int*)&f.
  • Unmöglich. Alles, was Sie bekommen, ist gleich null. Die Frage macht keinen Sinn.
  • Ich meinte, wie kann man speichern 0.37885 in einer Art, die nicht dezimale zahlen? Alles, was Sie bekommen, ist 0... Macht es Sinn?
  • Verwenden i = *(int*)&f, und zu einem späteren Zeitpunkt verwenden f = *(float*)&i. Die variable f behält seinen ursprünglichen Wert.
  • Ich verstehe, dass es sein Verlust. Ich habe das Sinus-Welle, die Werte generiert wie oben erwähnt, aber ich möchte, dass Sie als shorts. Direkte Umwandlung mit kurzen gibt mir einen Wert von 0. also, was ist die Lösung?
  • Hast du vergessen, dass dies ist java?
  • float hat 23 bit Mantisse, wie können Sie fit, dass in 16 bit, noch nicht einmal eingerechnet die zusätzliche Reichweite durch 8 bits von exponent
  • Nein, ich war unvorsichtig genug, nicht zu bemerken, dass, unter der Annahme, dass die Frage markiert, wie C (und Sie wissen, was Sie sagen, über die Mutterschaft der Annahmen)...
  • Sinus nimmt Werte im Bereich [-1,1]. Es gibt nur drei Werte in diesem Bereich, der dargestellt werden kann in jeder integer-Typ, -1, 0, und 1.
  • Ich nehme an, Sie haben Werte zwischen -1 und 1 haben will, kurze Ganzzahlen, um daraus eine wave-Datei oder geben Sie Sie in einen sound-Treiber. In diesem Fall einfach tun: intvalue = floatvalue * 65536.0f - 32768.0f;. Möglicherweise müssen code hinzufügen, schneiden Sie überschüssige.
  • Danke für die info. Ich bin es nun darum, Sie so Kurz.MaxValue für die android-hörgeschichte sound-Funktionalität, wie es akzeptiert eine kurze Puffer für die audio-Wiedergabe.

InformationsquelleAutor user3840530 | 2014-08-08
Schreibe einen Kommentar