Pazartesi günü bir hava durumu panosu yayına alırsınız. Çarşamba günü Toronto’daki bir kullanıcı bir hata bildirir: uygulama dış sıcaklığı 284 olarak göstermektedir. OpenWeatherMap endpoint’i Kelvin döndürmüştür (varsayılan değer), arayüzünüz Celsius beklemektedir ve aradaki hiçbir katman bunu denetleyecek kadar ilgilenmemiştir. Bir eksik çıkarma işlemi, Twitter’da bir bozuk ekran görüntüsü.
Yalnızca iki formüle ihtiyacınız varsa ve hızla işinize dönmek istiyorsanız:
- Celsius’tan Fahrenheit’a formülü:
°F = °C × 9/5 + 32 - Fahrenheit’tan Celsius’a formülü:
°C = (°F − 32) × 5/9 - Celsius’tan Kelvin’e:
K = °C + 273,15
Bu üç formül, geliştiricilerin gerçekte ihtiyaç duyduğunun yaklaşık %90’ını karşılar. Bu rehberin geri kalanı, diğer %10’u oluşturur: 9/5’in nereden geldiği, Kelvin’in neden hiçbir zaman negatif olmadığı, tür sisteminizin celsiusToFahrenheit(kelvinValue) çağrısını derleme sırasında nasıl reddedeceği ve Toronto hatasını yayına almayı nasıl bırakacağınız. Hızlıca bir sayıya ihtiyacınız olduğunda okumayı tamamen atlayıp sıcaklık dönüştürücümüzü kullanabilirsiniz. Sıcaklık dışı birimler için daha kapsamlı birim dönüşümü tam rehberine bakın.
Sıcaklık Diğer Birim Dönüşümlerinden Neden Farklıdır
Birim dönüşümlerinin çoğu, sıfırdan geçen son derece basit doğrusal ilişkilerdir. Bir metre 3,28084 fittir, nokta. Metreyi iki katına çıkarırsanız, fit de iki katına çıkar. Sıfır metre, sıfır fittir. Çift başına tek bir çarpan sabitiyle bir dönüşüm kütüphanesi kurabilir ve bir daha hiç düşünmeyebilirsiniz.
Sıcaklık bu modeli bozar: ölçekleri ortak bir sıfır noktası paylaşmaz. Celsius sıfırı suyun donma noktasına sabitler. Fahrenheit sıfırı 1724 dönemine ait bir tuzlu su karışımına sabitler. Kelvin sıfırı, termodinamiğin teorik tabanına sabitler. Herhangi iki ölçek arasında geçiş yapmak için hem bir ölçekleme çarpanına hem de bir kaydırmaya ihtiyacınız vardır — sıcaklık, doğrusal değil afin bir dönüşümdür.
Bunun tehlikeli bir sonucu vardır: sıcaklık değerleri, uzunluk veya kütle değerlerinin olduğu gibi toplanabilir değildir. 20°C + 20°C, hiçbir fiziksel anlamda 40°C etmez. “İki odayı birbirine ekleyip” daha sıcak bir oda elde edemezsiniz. Bir sıcaklık farkını bir sıcaklığa ekleyebilirsiniz; çünkü farklar gerçekten doğrusaldır. İşte bu ayrım, Birleşik Krallık’taki 2006 Medeva aşı olayının altındaki tuzaktı: bir ilaç soğuk zincir kayıt cihazı, mutlak bir okumayı bir delta ile karıştırarak binlerce dozu spesifikasyon dışı olarak işaretledi. Sıcaklık gibi yoğun nicelikler bu zihinsel korkuluğa ihtiyaç duyar: aynı birimi paylaşan sayılar, aynı cebiri otomatik olarak paylaşmaz.
Dört Sıcaklık Ölçeği Açıklaması
Günlük kod için yalnızca iki ölçek (Celsius, Fahrenheit) önemlidir, üçüncüsü bilimsel her şey için (Kelvin) önemlidir, dördüncüsü ise tek bir yerde karşımıza çıkar: ABD termodinamik ders kitapları ve hâlâ onlara başvuran HVAC kod tabanları.
Celsius (°C)
Anders Celsius, ölçeğini 1742’de yayımladı; başlangıçta 0° kaynama, 100° donma noktasıydı — bugün kullandığımızın tersine. Modern yönelim, yani 0°C’nin suyun bir standart atmosferdeki donma noktası ve 100°C’nin kaynama noktası olması, ölümünden kısa bir süre sonra geldi. Bugün günlük sıcaklık için SI türevli birimdir ve ABD, Bahamalar, Belize, Cayman Adaları ve Liberya dışındaki her ülkede varsayılan ölçektir.
2019 SI yeniden tanımlaması Celsius’u titiz biçimde Kelvin’e bağladı: 0°C artık tam olarak 273,15 K şeklinde tanımlanır. Bir zamanlar tanım olan suyun donma noktası, artık ölçülmüş bir sonuçtur (milyonda bir hassasiyetle 0°C’ye düşer ancak artık çıpa değildir).
Fahrenheit (°F)
Daniel Gabriel Fahrenheit, ölçeğini 1724’te önerdi. 0°F olarak belirli bir tuzlu su karışımının donma noktasını seçti — bir Danzig kışında güvenilir biçimde tekrar üretebileceği en soğuk sıcaklığı — ve vücut sıcaklığı olarak da 96°F’ı seçti. Saf suyun donma ve kaynama noktalarına göre yapılan sonraki yeniden kalibrasyon, vücut sıcaklığını 98,6°F’a çekti, donmayı 32°F’a ve kaynamayı 212°F’a yerleştirdi; bu da 180 derecelik bir aralıktır.
Fahrenheit, ABD’de hava durumu, yemek pişirme ve tıbbi kullanımda varlığını sürdürür. Donma ile kaynama arasındaki 180 derecelik aralık (Celsius’taki 100’e karşı), bazen “ortam sıcaklıkları için daha iyi çözünürlük” sunduğu gerekçesiyle savunulur — sınırda bir iddia, ama Amerikan termostatlarının neden 1°F adımlarıyla, Avrupa termostatlarının ise neden 0,5°C adımlarıyla işaretlendiğini açıklar.
Kelvin (K)
William Thomson, Lord Kelvin, 1848’de mutlak bir ölçek önerdi. Modern Kelvin, sıcaklığın SI temel birimidir. 2019 SI yeniden tanımlaması Kelvin’i Boltzmann sabiti k_B = 1,380649 × 10⁻²³ J/K’ye tam olarak bağlar; bu da onu ölçülen değil tanımlı bir büyüklük yapar.
Kelvin’in geliştiricilerin bilmesi gereken üç tuhaf özelliği vardır:
- Derece simgesi yok.
300°Kdeğil,300 Kyazın. Bu, 1967’den beri SI uzlaşımıdır. - Mutlak sıfırda başlar.
0 K = −273,15°C. Geçerli verilerde asla negatif bir Kelvin değeri görmemelisiniz; böyle bir değeri girdi hatası olarak değerlendirin. - Celsius ile aynı derece büyüklüğü. 1 K’lik bir değişim, 1°C’lik bir değişime eşittir. Sıcaklık farkları iki ölçek arasında değiştirilebilirdir; yalnızca mutlak değerler 273,15’lik kaymaya göre farklılaşır.
Sıcaklıkları çarptığınız veya böldüğünüz her durumda Kelvin doğru seçimdir — termal radyasyon (T⁴), ideal gaz yasası, kara cisim fiziği. Negatif veya sıfıra yakın bir Celsius değerine bölme, sonlu kalmasını istediğiniz fizik denklemlerini patlatır.
Rankine (°R)
William Rankine bu ölçeği 1859’da Kelvin’in Fahrenheit eşdeğeri olarak önerdi: mutlak bir ölçek, mutlak sıfırda başlayan, ancak Fahrenheit boyutlu derecelerle. 0°R = −459,67°F. 491,67°R = 0°C.
Rankine’i ABD termodinamik mühendisliği dışında — HVAC hesaplamaları, petrol rafinerisi, roket motoru yanma analizi — nadiren göreceksiniz; bu alanlarda matematik mutlak bir ölçek gerektirir ancak girdi verileri Fahrenheit olarak gelir. Dönüştürme mekanik bir iştir: °R = °F + 459,67 ya da eşdeğer biçimde °R = K × 9/5. Modern mühendislik yazılımlarının çoğu dahili olarak Kelvin’de kalabilir ve yalnızca görüntüleme için dönüştürme yapabilir; seçim hakkınız varsa önerdiğim de budur.
Sıcaklık Dönüştürme Formülleri (Altı Yönün Tümü)
Altı yön, dört ölçek, altı formül. Pratikte Celsius merkezli olanları ezberler, geri kalanını bunlardan türetirsiniz.
Celsius’tan Fahrenheit’a ve Geri
°F = °C × 9/5 + 32
°C = (°F − 32) × 5/9
9/5 çarpanı, iki ölçeğin aynı iki fiziksel referans noktası arasındaki aralıklarının oranıdır. Donmadan kaynamaya kadar Fahrenheit 180 dereceyi (32’den 212’ye), Celsius ise 100 dereceyi (0’dan 100’e) kapsar. 180 / 100 = 9/5 = 1,8. + 32 ise donma noktası sıfırlarını hizalamak için gereken kaymadır; çünkü Fahrenheit’ın sıfırı, Celsius’un sıfırının 32°F altındadır.
İşlenmiş örnek: °F = 25 × 9/5 + 32 = 45 + 32 = 77°F.
Celsius’tan Kelvin’e ve Geri
K = °C + 273,15
°C = K − 273,15
Ölçekleme yok, yalnızca bir kayma. 273,15, Celsius’un sıfırından (suyun donma noktası) mutlak sıfıra kadar olan sayısal mesafedir, Celsius dereceleriyle ölçülmüştür. Kelvin ile Celsius aynı derece büyüklüğünü paylaştığından, çarpan yoktur.
Fahrenheit’tan Kelvin’e ve Geri
K = (°F − 32) × 5/9 + 273,15
°F = (K − 273,15) × 9/5 + 32
Daha kısa bir biçim yoktur — hem ölçek değişikliği hem de kayma değişikliği gerekir. Kodda Celsius üzerinden geçmek daha temizdir: k = cToK(fToC(f)). Daha az yazarsınız, daha çok güvenirsiniz ve derleyici zaten bileşimi optimize edip kaldıracaktır.
Rankine Dönüşümleri
°R = °F + 459,67
°F = °R − 459,67
°R = K × 9/5
K = °R × 5/9
°R = °C × 9/5 + 491,67
491,67, 32 × 9/5 + 459,67’dir; yani 0°C’ye karşılık gelen Rankine değeridir. Bunları pratikte nadiren birleştirirsiniz. Rankine’e ihtiyacınız olduğunda onu “Fahrenheit’ın mutlak ikizi” olarak değerlendirin ve Fahrenheit veya Kelvin üzerinden geçin.
9/5 Nereden Geliyor? Hızlı Bir Türetme
İki ölçek °F = a × °C + b afin fonksiyonuyla ilişkilidir. a ve b’yi çözmek için iki bilinen kalibrasyon noktasına ihtiyacınız vardır. Donma ve kaynama, geleneksel çift olarak kullanılır:
- Donma:
0°C ↔ 32°F - Kaynama:
100°C ↔ 212°F
Her ikisini de °F = a × °C + b formülünde yerine koyun:
32 = a × 0 + b → b = 32
212 = a × 100 + 32 → a = (212 − 32) / 100 = 180 / 100 = 9/5
Hepsi bu — iki doğrusal denklem, iki bilinmeyen ve dönüşümün tamamı kendiliğinden çıkar. Geometrik sezgi: yan yana iki dikey termometre hayal edin, biri Celsius, diğeri Fahrenheit. Fahrenheit termometresi, Celsius’a göre dikey olarak gerilmiş (eğim 9/5) ve yukarı kaydırılmıştır (kesişim 32). Diğer her dönüşüm değeri o gerilmiş ve kaydırılmış doğru üzerinde yer alır.
Aynı türetme (0°C, 273,15 K) ve (100°C, 373,15 K) ile yapıldığında Celsius-Kelvin’i verir: eğim 1, kesişim 273,15. Aynı türetme, herhangi iki belirsizlik içermeyen kalibrasyon noktasıyla yapıldığında size herhangi bir afin dönüşümü verir. Sıcaklığa ilişkin matematiksel olarak özel hiçbir şey yoktur — karmaşıklık tamamen, diğer birim türlerinin ihtiyaç duymadığı iki çıpa noktalı kurulumdadır.
−40°‘lik Kesişim: Yararlı Bir Anımsatıcı
Celsius ile Fahrenheit’ın aynı değeri okuduğu bir sıcaklık var mıdır? Dönüşüm formülünde °C = °F yazın:
°C = °C × 9/5 + 32
°C − °C × 9/5 = 32
°C × (1 − 9/5) = 32
°C × (−4/5) = 32
°C = −40
Yani −40°C = −40°F. Tek bir kesişim noktası ve bu da Yellowknife, Yakutsk veya Fairbanks’te ocak ayında karşılaşabileceğiniz gerçek bir sıcaklığa denk gelir. Aynı zamanda ucuz bir zihinsel denetimdir: bir C↔F dönüşümünü göz kararı yaparken sonuç −40 civarına düşüyorsa, her iki sayı birbirine yakın olmalıdır. Biri −40°C, diğeri −72°F diyorsa, bir yön hatanız vardır.
Tüm anımsatıcı listemi monitörümün yanına yapışkanla tutturmuş halde tutarım: donma (0 / 32), vücut sıcaklığı (37 / 98,6), oda sıcaklığı (20 / 68), kaynama (100 / 212), −40 (−40 / −40). Beş nokta, ihtiyaç duyduğum hemen hemen her sağduyu denetimini karşılar.
Kodda Sıcaklık Dönüşümü
Formüller son derece basittir. Bunları gerçek bir kod tabanında doğru elde etmek iki şeye bağlıdır: bir çağıranın Celsius istediğiniz yerde Fahrenheit geçmesini engellemek ve sınırlardaki (donma, mutlak sıfır, fırın sıcaklıkları) kayan nokta davranışını öngörülebilir kılmak. Aşağıdaki her örnek, eksiksiz ve çalıştırılabilir bir programdır.
JavaScript / TypeScript
Düz JavaScript size hemen işlevsel dönüşümler sağlar:
const cToF = (c) => c * 9 / 5 + 32;
const fToC = (f) => (f - 32) * 5 / 9;
const cToK = (c) => c + 273.15;
const kToC = (k) => k - 273.15;
const fToK = (f) => cToK(fToC(f));
const kToF = (k) => cToF(kToC(k));
const cToR = (c) => (c + 273.15) * 9 / 5;
const rToC = (r) => r * 5 / 9 - 273.15;
console.log(cToF(100)); // 212
console.log(fToC(98.6)); // 37
console.log(kToC(300)); // 26.85
TypeScript, sayı türünü markalayarak (branded types) birim karışıklığını derleme hatasına dönüştürmenize olanak tanır:
type Scale = 'C' | 'F' | 'K' | 'R';
type Temp<S extends Scale> = number & { readonly __scale: S };
const t = <S extends Scale>(value: number, _scale: S): Temp<S> =>
value as Temp<S>;
const cToF = (c: Temp<'C'>): Temp<'F'> => t(c * 9 / 5 + 32, 'F');
const fToC = (f: Temp<'F'>): Temp<'C'> => t((f - 32) * 5 / 9, 'C');
const indoor = t(22, 'C');
const outdoor = cToF(indoor); // OK: Temp<'F'>
// const broken = cToF(outdoor); // Derleme hatası: Temp<'F'> bir Temp<'C'> değildir
Branded types’ın çalışma anı maliyeti sıfırdır ve size yaklaşık on satır şablon koda mal olur. Karşılığında, açılış paragrafındaki Toronto hatası editörünüzde kırmızı bir dalgalı çizgiye dönüşür.
Python
Düz işlevler iyi çalışır, ancak bir Enum artı dataclass, bir sıcaklığı kaydettiğiniz ilk anda kendini amorti eder:
from dataclasses import dataclass
from enum import Enum
class Scale(Enum):
C = "°C"
F = "°F"
K = "K"
R = "°R"
@dataclass(frozen=True)
class Temperature:
value: float
scale: Scale
def to(self, target: Scale) -> "Temperature":
c = _to_celsius(self)
return _from_celsius(c, target)
def __str__(self) -> str:
return f"{self.value:.2f}{self.scale.value}"
def _to_celsius(t: Temperature) -> float:
if t.scale is Scale.C: return t.value
if t.scale is Scale.F: return (t.value - 32) * 5 / 9
if t.scale is Scale.K: return t.value - 273.15
if t.scale is Scale.R: return (t.value - 491.67) * 5 / 9
raise ValueError(f"Unknown scale: {t.scale}")
def _from_celsius(c: float, scale: Scale) -> Temperature:
if scale is Scale.C: return Temperature(c, scale)
if scale is Scale.F: return Temperature(c * 9 / 5 + 32, scale)
if scale is Scale.K: return Temperature(c + 273.15, scale)
if scale is Scale.R: return Temperature(c * 9 / 5 + 491.67, scale)
raise ValueError(f"Unknown scale: {scale}")
body = Temperature(37, Scale.C)
print(body.to(Scale.F)) # 98.60°F
print(body.to(Scale.K)) # 310.15K
0.1 + 0.2 != 0.3’ün denetim sorunu haline geldiği bilimsel verilerle uğraşıyorsanız, float yerine decimal.Decimal kullanın. Bunun bedeli hızdır (Decimal yaklaşık 50 kat daha yavaştır) ve ayrıca 5/9’un da kesin bir ondalık temsili yoktur, bu nedenle denetlenen bir bağlamla Decimal(5) / Decimal(9) kullanmanız gerekir. Çoğu sensör pipeline’ı için float artı görüntüleme sınırında round(value, 2) yeterlidir.
Go
Go’nun tür sistemi, TypeScript’ten daha ileri gitmenize olanak tanır: adlandırılmış bir float64 türü, aynı çalışma anı temsilini paylaşsalar bile başka bir adlandırılmış float64 ile sessizce karıştırılamaz.
package main
import "fmt"
type Celsius float64
type Fahrenheit float64
type Kelvin float64
type Rankine float64
func (c Celsius) ToFahrenheit() Fahrenheit { return Fahrenheit(c*9/5 + 32) }
func (c Celsius) ToKelvin() Kelvin { return Kelvin(c + 273.15) }
func (f Fahrenheit) ToCelsius() Celsius { return Celsius((f - 32) * 5 / 9) }
func (k Kelvin) ToCelsius() Celsius { return Celsius(k - 273.15) }
func (f Fahrenheit) ToKelvin() Kelvin { return f.ToCelsius().ToKelvin() }
func main() {
room := Celsius(22)
fmt.Printf("%.2f °F\n", room.ToFahrenheit()) // 71.60 °F
fmt.Printf("%.2f K\n", room.ToKelvin()) // 295.15 K
// var bug Fahrenheit = room // derleme hatası
// fmt.Println(room.ToKelvin() + 1) // derleme hatası: Kelvin + tipsiz int için Kelvin(1) gerekir
}
Maliyeti ölçek başına yaklaşık bir satırdır. Yararı ise ToFahrenheit’ın kazara bir Kelvin değeri kabul edememesi ve Celsius alan bir fonksiyonun çağrı noktasında ham bir float64’ü reddetmesidir.
Rust
Rust’ın newtype deseni, size Go ile aynı garantileri verir, ek olarak ucuz From/Into dönüşümleri sağlar:
#[derive(Clone, Copy, Debug, PartialEq)]
struct Celsius(f64);
#[derive(Clone, Copy, Debug, PartialEq)]
struct Fahrenheit(f64);
#[derive(Clone, Copy, Debug, PartialEq)]
struct Kelvin(f64);
impl From<Celsius> for Fahrenheit {
fn from(c: Celsius) -> Self { Fahrenheit(c.0 * 9.0 / 5.0 + 32.0) }
}
impl From<Fahrenheit> for Celsius {
fn from(f: Fahrenheit) -> Self { Celsius((f.0 - 32.0) * 5.0 / 9.0) }
}
impl From<Celsius> for Kelvin {
fn from(c: Celsius) -> Self { Kelvin(c.0 + 273.15) }
}
impl From<Kelvin> for Celsius {
fn from(k: Kelvin) -> Self { Celsius(k.0 - 273.15) }
}
fn main() {
let body = Celsius(37.0);
let body_f: Fahrenheit = body.into();
let body_k: Kelvin = body.into();
println!("{:.2} {:?} {:?}", body.0, body_f, body_k);
// 37.00 Fahrenheit(98.6) Kelvin(310.15)
}
Üzerine doğrulama katmanı ekleyebilirsiniz: negatif değerleri reddeden bir TryFrom<f64> for Kelvin, Result<Kelvin, TemperatureError> döndürür ve denetimi yapım anına çeker. Geçersiz durumlar iş mantığınıza asla ulaşmaz.
SQL (PostgreSQL)
Sıcaklıkları CHECK kısıtlamalarıyla saklayın ve alternatif birimleri üretilen sütunlar olarak türetin. Bu sayede negatif bir Kelvin değeri, üç sorgu sonrasında sessiz bir veri hatası değil, ekleme anında bir kısıtlama ihlali olur.
CREATE OR REPLACE FUNCTION c_to_f(c numeric) RETURNS numeric AS $$
SELECT c * 9.0 / 5.0 + 32.0;
$$ LANGUAGE SQL IMMUTABLE;
CREATE OR REPLACE FUNCTION c_to_k(c numeric) RETURNS numeric AS $$
SELECT c + 273.15;
$$ LANGUAGE SQL IMMUTABLE;
CREATE TABLE sensor_readings (
id bigserial PRIMARY KEY,
recorded_at timestamptz NOT NULL DEFAULT now(),
celsius numeric(6, 2) NOT NULL,
fahrenheit numeric(6, 2) GENERATED ALWAYS AS (c_to_f(celsius)) STORED,
kelvin numeric(6, 2) GENERATED ALWAYS AS (c_to_k(celsius)) STORED,
CONSTRAINT kelvin_non_negative CHECK (celsius >= -273.15)
);
INSERT INTO sensor_readings (celsius) VALUES (22.5), (0), (100);
SELECT celsius, fahrenheit, kelvin FROM sensor_readings;
-- 22.50 | 72.50 | 295.65
-- 0.00 | 32.00 | 273.15
-- 100.00| 212.00 | 373.15
-- Ekleme anında reddedilir:
-- INSERT INTO sensor_readings (celsius) VALUES (-300);
-- ERROR: new row for relation "sensor_readings" violates check constraint
GENERATED ALWAYS AS ... STORED biraz disk alanını sorgu anındaki hıza takas eder — değeri okursunuz, yeniden hesaplamazsınız. Yüksek hacimli IoT tabloları için, disk baskısı okuma gecikmesinden daha çok önem taşıdığında STORED yerine bir görünüm kullanın.
Hava Durumu ve IoT API’lerini Ele Alma
Sıcaklıkla ilgili en yaygın üretim hatası bir formül hatası değildir. Bir API’nin döndürdüğü ile arayüzünüzün gösterdiği arasındaki birim uyumsuzluğudur. Geliştiricilerin en sık karşılaştığı sağlayıcılar:
OpenWeatherMap, varsayılan olarak Kelvin döndürür. Celsius için units=metric, Fahrenheit için units=imperial parametresini geçin. Sorgu parametresini unutursanız Kelvin alırsınız. temp adlı bir alanda gelen 284,15 gibi sayılar, bir entegrasyon testi yazmaya değecek kadar çok mühendisi yanılttı.
Open-Meteo, varsayılan olarak Celsius döndürür ve temperature_unit=fahrenheit parametresini kabul eder. Kelvin seçeneği yoktur — bilimsel bir API değildir.
Tomorrow.io ve WeatherAPI, varsayılan olarak metrik kullanır ancak aynı yanıtta her iki ölçeği farklı anahtarlar altında döndürür. Komşu anahtarı değil, kodunuzun başvurduğu gerçek anahtarı okuyun.
Herhangi bir hava durumu veya sensör veri alımı için kullandığım desen:
type Reading = {
value: number;
scale: 'C' | 'F' | 'K';
source: string;
};
function normalise(raw: Reading): number /* celsius */ {
switch (raw.scale) {
case 'C': return raw.value;
case 'F': return (raw.value - 32) * 5 / 9;
case 'K': return raw.value - 273.15;
}
}
// Veri alımında, her okuma kendi ölçeğini açıkça taşır.
// Arayüz katmanı asla tahmin etmez — celsius tüketir ve kullanıcı tercihine göre biçimlendirir.
Bundan iki kural çıkar:
- Her veri alım sınırı kaynak ölçeği kayıt altına alır. Modüller arasında çıplak sayılar geçmez.
- Görüntüleme katmanı, kullanıcının tercih ettiği birime dönüştürdüğü tek yerdir.
Çift dönüşüm — iki katmanın her birinin sayıyı “normalize ettiği” durum — diğer sık görülen hatadır. Bir backend ekibi yazma sırasında Kelvin’i Celsius’a çevirir. Bir frontend ekibi, bundan habersiz, aynı - 273,15 çıkarmayı okuma sırasında uygular. Kullanıcılar −251°C civarında sıcaklıklar görür. Düzeltme, daha fazla test değil, normalleştirme için tek bir sahip belirlemektir.
IoT için ham sensör verileri çoğu zaman bir kalibrasyon eğrisi üzerinden sıcaklığa dönüştürülmesi gereken bir ADC sayımı olarak gelir (10kΩ NTC termistör için bu, Steinhart–Hart denklemi anlamına gelir). Sıcaklık ölçeği dönüşümleri bundan sonra, kalibre edilmiş değer üzerinde gerçekleşir. İki aşamayı karıştırmak, sıcaklık biçiminde görünen ama %30 sapan sayılarla sonuçlanmanın yoludur.
Yaygın Tuzaklar ve Bunlardan Nasıl Kaçınılır
Bu altısı gerçek üretim kod tabanlarında ortaya çıkar. Kendinizinkini bunlara karşı denetleyin.
Yanlış Formül Yönünü Kullanmak
Yaygın belirti: 37°C bebek ateşini gösteren ve sonra bunu kritik olarak işaretleyen bir uygulama. Olan şu: API 37°F döndürdü, biri sütun adı öyle dediği için sayıya celsius etiketi yapıştırdı ve tıbbi eşik mantığı bir Celsius ölçeğine karşı karşılaştırma yaptı. Bunu, birimi değişken adının değil, türün taşımasını sağlayarak önleyin.
Sıcaklığı Yaygın (Extensive) Olarak Ele Almak
averageTemperature mantıklıdır. sumTemperatures mantıklı değildir. Toplama SQL’inizde SUM(temperature_c) varsa, bir şeyler ters demektir — büyük olasılıkla AVG veya nadir durumlarda integral alınmış bir derece-gün ölçütü istiyorsunuzdur. Sıcaklık yoğun bir niceliktir; ikisini toplayıp anlamlı bir sonuç beklemeyin.
Kayan Nokta Yuvarlaması
JavaScript’te (37 * 9 / 5) + 32, 98.6 değil 98.60000000000001 sonucunu verir. IEEE 754 double kullanan her dilin davranışı aynıdır. Seçenekler:
.toFixed(2)(veya dilinizin eşdeğeri) ile görüntüleyin ve orada durun.- Denetim düzeyinde doğruluk için bir ondalık kütüphanesi (
decimal.js,Python Decimal,BigDecimal) kullanın. - Tam sayı olarak desi-derecelerde saklayın (
37.0yerine370) ve yalnızca görüntülemede bölün.
Bir arayüzdeki görüntüleme için toFixed(2) doğru tercihtir. Yuvarlama hatalarının biriktiği bir faturalama veya düzenleyici sistem için ondalık kullanın.
Girdi Doğrulamada Negatif Kelvin
Kelvin, fiziksel yasa gereği negatif olamaz. { "tempK": -10 } içeren bir istek gövdesi her zaman geçersizdir. Bunu sınırda zorlayın — JSON şeması, Pydantic, Zod, CHECK kısıtlaması — iş mantığının derinlerinde değil. Tek istisna olan “negatif mutlak sıcaklığa” sahip kuantum sistemleri, entegre etmeniz olası hiçbir API’de karşımıza çıkmaz; çıkarsa, çıktığını zaten biliyorsunuzdur.
Arayüzde ve Loglarda Eksik Birim Etiketleri
sensor 42: 37 yazan bir log satırı, altı ay sonra işe yaramaz. Celsius mu? Fahrenheit mı? Ham bir ADC sayımı mı? Her zaman sensor 42: 37°C yazın ya da logu { "sensor": 42, "value": 37, "unit": "celsius" } olarak yapılandırın. Disk alanı ucuzdur; sabaha karşı üçte üretim sorunu gidermek değildir.
Saat Dilimi Karışıklığı ve Sıcaklık
Seyahat uygulamaları bu hatayı yayına alır: bir kullanıcı saat dilimini geçtiğinde, kod yardımseverce zaman damgası taşıyan her alanı kaydırır — sıcaklık okumaları dahil. Sıcaklık, saat dilimleriyle ilgilenmez. Bir okumadaki zaman damgası saat dilimi mantığına ihtiyaç duyar; okuma değerinin buna ihtiyacı yoktur. Bunları ayrı alanlarda tutun, ayrı dönüşüm pipeline’larından geçirin.
Zihinsel Matematik Kısayolları
Açık bir dönüştürücünüz olmadığında işinize yarar.
Celsius’tan Fahrenheit’a (yaklaşık): ikiyle çarpın, 30 ekleyin. 20°C → 70°F (gerçek 68). 30°C → 90°F (gerçek 86). 0–40°C aralığında 2–3°F içinde doğrudur ve bu, bir fırın dışında deneyimlediğiniz her sıcaklığı kapsar.
Fahrenheit’tan Celsius’a (yaklaşık): 30 çıkarın, ikiye bölün. 80°F → 25°C (gerçek 26,7). 60°F → 15°C (gerçek 15,6). Aynı doğruluk bandı.
Celsius’tan Kelvin’e: 273 ekleyin ve yuvarlayın. 0,15 K kaybedersiniz, bu da fizik laboratuvarı dışındaki her şey için termometre hassasiyetinin altındadır.
Ezberlemeye değer iki çıpa: 20°C = 68°F ≈ 293 K ve 100°C = 212°F = 373,15 K. Bu ikisinden, doğrusal interpolasyon herhangi bir tahmine yetecek kadar yaklaştırır.
Hızlı ve kaba kurallar; seyahati, kabaca yemek pişirmeyi ve hava durumu tahminlerini karşılar. Koda veya bir düzenleyici dosyaya girecek herhangi bir şey için, kesin formülleri kullanın — ya da ücretsiz sıcaklık dönüştürme aracımızı açıp tam değeri kopyalayın.
Referans Tabloları
Günlük Sıcaklıklar
| Bağlam | Celsius | Fahrenheit | Kelvin |
|---|---|---|---|
| Ev derin dondurucusu | −18°C | 0°F | 255,15 K |
| Donma noktası | 0°C | 32°F | 273,15 K |
| Buzdolabı | 4°C | 39°F | 277,15 K |
| Oda sıcaklığı | 20°C | 68°F | 293,15 K |
| Vücut sıcaklığı | 37°C | 98,6°F | 310,15 K |
| Ateş eşiği | 38°C | 100,4°F | 311,15 K |
| Sıcak yaz günü | 35°C | 95°F | 308,15 K |
| Su kaynar | 100°C | 212°F | 373,15 K |
Yemek Pişirme ve Fırın Dönüşümleri
| Fırın ön ayarı | Celsius | Fahrenheit |
|---|---|---|
| Düşük / yavaş pişirme | 125°C | 257°F |
| Sıcak pişirme | 150°C | 302°F |
| Orta sıcaklıkta pişirme | 175°C | 347°F |
| Standart pişirme (kek) | 180°C | 356°F |
| Kızartma | 190°C | 374°F |
| Sıcak kızartma | 200°C | 392°F |
| Yüksek kızartma | 220°C | 428°F |
| Pizza / ekmek kabuğu | 250°C | 482°F |
Amerikan tarifleri 350°F’ı yemek kitabına göre 175°C veya 180°C’ye yuvarlar; tam değer 176,67°C’dir. Her iki seçim de işe yarar — ev fırınları sıcaklığı zaten ±5°C’den daha iyi tutamaz.
Bilimsel Uç Noktalar
| Olgu | Kelvin | Celsius |
|---|---|---|
| Mutlak sıfır (teorik taban) | 0 K | −273,15°C |
| Kozmik mikrodalga arka plan | 2,725 K | −270,425°C |
| Sıvı helyum (kaynama, 1 atm) | 4,2 K | −268,95°C |
| Süperiletken geçişi (YBCO) | 93 K | −180,15°C |
| Sıvı azot (kaynama) | 77 K | −196,15°C |
| Derin uzay gölgesi | ~40 K | ~−233°C |
| Kuru buz (süblimasyon) | 194,65 K | −78,5°C |
| Güneş’in yüzeyi | 5.778 K | 5.504,85°C |
| Güneş’in çekirdeği | 1,57×10⁷ K | 1,57×10⁷ °C* |
| Tokamak plazması (ITER hedefi) | 1,5×10⁸ K | ~1,5×10⁸ °C* |
*Bu büyüklüklerde 273,15 K kayması bir yuvarlama hatasıdır — Celsius ile Kelvin fiilen aynı değeri okur.
SSS
Celsius’u Fahrenheit’a dönüştürmenin formülü nedir?
Celsius’u 9/5 (veya 1,8) ile çarpın, ardından 32 ekleyin: °F = °C × 9/5 + 32. Örneğin 25°C × 1,8 + 32 = 77°F. Çarpan, iki ölçeğin donmadan kaynamaya kadar olan aralıklarındaki 180:100 oranını yansıtır; 32 ise farklı sıfır noktalarını hizalar.
Fahrenheit’ı Celsius’a dönüştürmenin formülü nedir?
Fahrenheit değerinden 32 çıkarın, ardından 5/9 ile çarpın: °C = (°F − 32) × 5/9. 72°F için hesaplama (72 − 32) × 5/9 = 40 × 5/9 ≈ 22,22°C şeklindedir. Önce çıkarın, sonra çarpın — sırayı tersine çevirmek yanlış cevap verir.
Celsius ile Fahrenheit hangi sıcaklıkta eşittir?
Tam olarak −40 derecede. Dönüşüm formülünde °C = °F koymak °C = °C × 9/5 + 32’yi verir, bu da °C = −40 şeklinde çözülür. Bu, iki ölçeğin aynı sayıyı okuduğu tek sıcaklıktır ve hem gerçek dünyadaki soğuk dalgaları hem de dönüşüm yönü hatalarını anlamak için kullanışlı bir sağduyu kontrol noktasıdır.
Yemek pişirmek için 350°F’ı Celsius’a nasıl çeviririm?
350°F yaklaşık 176,67°C’ye eşittir. Avrupa tarifleri bunu genellikle 180°C’ye yuvarlar ve birçok Amerikan-metrik dönüştürme tablosu 175°C kullanır. Her ikisi de bir ev fırınında işe yarar — bu aralıkta sıcaklık kararlılığı, yuvarlama hatasından daha kötüdür. Hassasiyet önemli olduğunda kesin değerler için sıcaklık dönüştürücü aracımızı kullanın.
100°F Celsius olarak kaçtır?
100°F ≈ 37,78°C. Bu, normal vücut sıcaklığının (37°C / 98,6°F) hemen üzerindedir ve genellikle düşük dereceli ateşin başlangıcı olarak işaretlenir. Tıbbi kılavuzlar 38°C / 100,4°F’ı gerçek ateş eşiği olarak kabul eder, dolayısıyla 100°F sınırdadır ancak henüz klinik açıdan anlamlı değildir.
Mutlak sıfır neden sadece −273 değil de −273,15°C?
Çünkü 2019 SI yeniden tanımlaması Boltzmann sabitini tam olarak sabitledi ve bu da −273,15°C’yi yuvarlanmış bir yaklaşık değer değil, mutlak sıfırın kesin hesaplanmış değeri haline getirdi. 2019’dan önce Celsius’un sıfırı suyun üçlü noktasına bağlanıyordu ve 0,15 ölçümden geliyordu. Şimdi tanım gereği kesindir.
Kodda Celsius yerine ne zaman Kelvin kullanmalıyım?
Bir sıcaklığı çarptığınız, böldüğünüz veya bir kuvvete yükselttiğiniz her durumda — kara cisim radyasyonu (T⁴), ideal gaz hesaplamaları, reaksiyon hızları. Kelvin asla negatif olmaz, bu nedenle bölme kararlı kalır. Sıcaklık farkları için Celsius ve Kelvin değiştirilebilirdir (5 derecelik bir değişim her ikisinde de aynıdır).
Rankine 2026’da hâlâ kullanılıyor mu?
Evet, ama dar bir alanda. ABD makine, HVAC ve havacılık mühendisliği, diğer tüm girdilerin Fahrenheit olduğu termodinamik çevrim analizi için hâlâ Rankine kullanır. Bu alanların ve ABD’nin dışında, Rankine fiilen ölü sayılır. Genel amaçlı yazılım yazıyorsanız Rankine desteği ucuz bir sigortadır ancak nadiren yük taşır.
SQL sorgusunda sıcaklığı nasıl dönüştürürüm?
Formülü satır içinde kullanın ya da bir GENERATED ALWAYS AS sütunu kullanın. Örnek: SELECT celsius * 9.0 / 5.0 + 32.0 AS fahrenheit FROM readings. 9.0 ve 5.0 (9 ve 5 değil), çoğu dilekte kayan nokta aritmetiğini zorlar; tam sayı bölmesi sessizce kırpar. Saçma değerleri ekleme anında reddetmek için bir CHECK (celsius >= -273.15) ekleyin.
Celsius’u kafamda Fahrenheit’a çevirmenin en kolay yolu nedir?
Celsius değerini ikiyle çarpın ve 30 ekleyin. 22°C × 2 + 30 = 74°F (gerçek 71,6°F). 0–30°C aralığında yaklaşık 2°F içinde doğrudur, bu da neredeyse tüm hava durumu ve iç mekan okumalarını kapsar. Tersi için Fahrenheit’tan 30 çıkarın ve ikiye bölün.
Sıcaklık dönüştürücüm 37°C için neden 98,599999 döndürüyor?
Çünkü 9/5 = 1,8, ikili kayan noktada tam olarak temsil edilemez, bu nedenle 37 × 9 / 5 + 32, 98,6 yerine 98,60000000000001 olarak çıkar. Bu IEEE 754 davranışıdır, bir hata değildir. Görüntüleme için toFixed(2) kullanın ya da alanınızda son basamak hassasiyeti önemliyse bir ondalık kütüphanesine geçin.
Kayan nokta sorunlarını önlemek için sıcaklıkları tam sayı olarak saklayabilir miyim?
Evet — desi-Celsius (sıcaklığın 10 katı) saklayın. 37,0°C, 370 olur; 22,5°C, 225 olur. Tam sayı matematiği kesindir ve yalnızca görüntüleme sınırında 10’a bölersiniz. Bu desen, gömülü sistemlerde ve disk ile CPU’nun önem taşıdığı yüksek hacimli zaman serisi veritabanlarında yaygındır.
Bir API yanıtında birimsiz sayıları nasıl ele alırım?
Ele almayın. Her sıcaklık alanı ya alan adında (temp_celsius, temp_k) ya da kardeş bir unit alanında açık bir birim taşımalıdır. Tüketici sizseniz ve API bunu sağlamıyorsa, varsayımı kodda yüksek sesle belgeleyin ve API’nin varsayılan değeri değişirse kırılan bir contract test yazın.
Suyun kaynama noktası dört ölçekte de kaçtır?
Standart atmosfer basıncında (bir atmosfer, 101,325 kPa) 100°C = 212°F = 373,15 K = 671,67°R. Basınç önemlidir: Denver yüksekliğinde su yaklaşık 95°C’de, Everest tepesinde ise 71°C’ye yakın bir sıcaklıkta kaynar. Kaynama noktası evrensel bir sabit değil, basınca bağlı bir niceliktir.
Sıcaklık, kayan nokta hesaplamalarını diğer sayılardan farklı mı etkiler?
Hayır — sıcaklık değerleri herhangi bir kayan nokta sayısı gibi davranır. Asıl pratik tuzak, dönüşüm formüllerindeki 5/9 ve 9/5 çarpanlarının her dönüşüm adımında yuvarlama hatası eklemesidir. 200–400 aralığındaki Kelvin değerleri için hassasiyet fazlasıyla yeterlidir. Temsil edilebilir double’ların sınırına yakın sıfır altı Celsius değerleri için de hassasiyet iyi kalır. Asıl tuzak, küçük hataların biriktiği zincirleme dönüşümlerdir — bir kez dönüştürün ve kanonik biçimi saklayın.